582 if(assemblyFEElements_.size()== 0)
583 initAssembleFEElements(nonLinElasModell,problemDisk,elements, params,pointsRep,domain->getElementMap());
584 else if(assemblyFEElements_.size() != elements->numberElements())
585 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Number Elements not the same as number assembleFE elements." );
587 Teuchos::ArrayRCP<SC> eModVecA = eModVec->getDataNonConst(0);
589 SmallMatrixPtr_Type elementMatrix;
590 for (UN T=0; T<assemblyFEElements_.size(); T++) {
591 vec_dbl_Type solution(0);
593 solution_d = getSolution(elements->getElement(T).getVectorNodeList(), d_rep,dofs);
595 solution.insert( solution.end(), solution_d.begin(), solution_d.end() );
597 assemblyFEElements_[T]->updateSolution(solution);
598 assemblyFEElements_[T]->updateParameter(
"E",eModVecA[T]);
599 assemblyFEElements_[T]->assembleJacobian();
600 elementMatrix = assemblyFEElements_[T]->getJacobian();
601 addFeBlock(A, elementMatrix, elements->getElement(T), map, 0, 0, problemDisk);
603 assemblyFEElements_[T]->assembleRHS();
604 rhsVec = assemblyFEElements_[T]->getRHS();
605 addFeBlockMv(resVec, rhsVec, elements->getElement(T), dofs);
607 assemblyFEElements_[T]->advanceNewtonStep();
611 if (callFillComplete)
612 A->getBlock(0,0)->fillComplete( domainVec_.at(0)->getMapVecFieldUnique(),domainVec_.at(0)->getMapVecFieldUnique());
629template <
class SC,
class LO,
class GO,
class NO>
630void FE<SC,LO,GO,NO>::addFeBlockMv(BlockMultiVectorPtr_Type &res, vec_dbl_ptr_Type rhsVec, FiniteElement elementBlock,
int dofs){
632 Teuchos::ArrayRCP<SC> resArray_block = res->getBlockNonConst(0)->getDataNonConst(0);
634 vec_LO_Type nodeList_block = elementBlock.getVectorNodeList();
636 for(
int i=0; i< nodeList_block.size() ; i++){
637 for(
int d=0; d<dofs; d++)
638 resArray_block[nodeList_block[i]*dofs+d] += (*rhsVec)[i*dofs+d];
643template <
class SC,
class LO,
class GO,
class NO>
645 std::string FETypeChem,
646 std::string FETypeSolid,
650 MultiVectorPtr_Type c_rep,
651 MultiVectorPtr_Type d_rep,
652 BlockMatrixPtr_Type &A,
653 BlockMultiVectorPtr_Type &resVec,
654 ParameterListPtr_Type params,
655 std::string assembleMode,
656 bool callFillComplete,
659 if((FETypeChem !=
"P2") || (FETypeSolid !=
"P2") || dim != 3)
660 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"No AceGen Implementation available for Discretization and Dimension." );
666 ElementsPtr_Type elementsChem= domainVec_.at(FElocChem)->getElementsC();
668 ElementsPtr_Type elementsSolid = domainVec_.at(FElocSolid)->getElementsC();
674 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FElocSolid)->getPointsRepeated();
676 MapConstPtr_Type mapChem = domainVec_.at(FElocChem)->getMapRepeated();
678 MapConstPtr_Type mapSolid = domainVec_.at(FElocSolid)->getMapRepeated();
680 vec_dbl_Type solution_c;
681 vec_dbl_Type solution_d;
683 vec_dbl_ptr_Type rhsVec;
688 if(FETypeChem ==
"P2"){
693 if(FETypeChem ==
"P2")
697 if(FETypeSolid ==
"P2")
702 if(FETypeSolid ==
"P2")
705 tuple_disk_vec_ptr_Type problemDisk = Teuchos::rcp(
new tuple_disk_vec_Type(0));
706 tuple_ssii_Type chem (
"Chemistry",FETypeChem,dofsChem,numChem);
707 tuple_ssii_Type solid (
"Solid",FETypeSolid,dofsSolid,numSolid);
708 problemDisk->push_back(solid);
709 problemDisk->push_back(chem);
711 tuple_disk_vec_ptr_Type problemDiskChem = Teuchos::rcp(
new tuple_disk_vec_Type(0));
712 problemDiskChem->push_back(chem);
714 std::string SCIModel = params->sublist(
"Parameter").get(
"Structure Model",
"SCI_simple");
716 if(assemblyFEElements_.size()== 0){
717 initAssembleFEElements(SCIModel,problemDisk,elementsChem, params,pointsRep,domainVec_.at(FElocSolid)->getElementMap());
719 else if(assemblyFEElements_.size() != elementsChem->numberElements())
720 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Number Elements not the same as number assembleFE elements." );
724 MultiVectorPtr_Type resVec_c = Teuchos::rcp(
new MultiVector_Type( domainVec_.at(FElocChem)->getMapRepeated(), 1 ) );
725 MultiVectorPtr_Type resVec_d = Teuchos::rcp(
new MultiVector_Type( domainVec_.at(FElocSolid)->getMapVecFieldRepeated(), 1 ) );
727 BlockMultiVectorPtr_Type resVecRep = Teuchos::rcp(
new BlockMultiVector_Type( 2) );
728 resVecRep->addBlock(resVec_d,0);
729 resVecRep->addBlock(resVec_c,1);
737 for (UN T=0; T<assemblyFEElements_.size(); T++) {
738 vec_dbl_Type solution(0);
740 solution_c = getSolution(elementsChem->getElement(T).getVectorNodeList(), c_rep,dofsChem);
741 solution_d = getSolution(elementsSolid->getElement(T).getVectorNodeList(), d_rep,dofsSolid);
744 solution.insert( solution.end(), solution_d.begin(), solution_d.end() );
745 solution.insert( solution.end(), solution_c.begin(), solution_c.end() );
747 assemblyFEElements_[T]->updateSolution(solution);
749 SmallMatrixPtr_Type elementMatrix;
761 if(assembleMode ==
"Jacobian"){
762 assemblyFEElements_[T]->assembleJacobian();
764 elementMatrix = assemblyFEElements_[T]->getJacobian();
766 assemblyFEElements_[T]->advanceNewtonStep();
768 addFeBlockMatrix(A, elementMatrix, elementsSolid->getElement(T), elementsSolid->getElement(T), mapSolid, mapChem, problemDisk);
773 if(assembleMode ==
"Rhs"){
774 assemblyFEElements_[T]->assembleRHS();
775 rhsVec = assemblyFEElements_[T]->getRHS();
776 addFeBlockMv(resVecRep, rhsVec, elementsSolid->getElement(T),elementsChem->getElement(T), dofsSolid,dofsChem);
779 if(assembleMode==
"MassMatrix"){
780 assemblyFEElements_[T]->assembleJacobian();
782 AssembleFE_SCI_SMC_Active_Growth_Reorientation_Ptr_Type elTmp = Teuchos::rcp_dynamic_cast<AssembleFE_SCI_SMC_Active_Growth_Reorientation_Type>(assemblyFEElements_[T] );
783 elTmp->getMassMatrix(elementMatrix);
785 addFeBlock(A, elementMatrix, elementsChem->getElement(T), mapChem, 0, 0, problemDiskChem);
794 if ( assembleMode ==
"Jacobian"){
795 A->getBlock(0,0)->fillComplete();
796 A->getBlock(1,0)->fillComplete(domainVec_.at(FElocSolid)->getMapVecFieldUnique(),domainVec_.at(FElocChem)->getMapUnique());
797 A->getBlock(0,1)->fillComplete(domainVec_.at(FElocChem)->getMapUnique(),domainVec_.at(FElocSolid)->getMapVecFieldUnique());
798 A->getBlock(1,1)->fillComplete();
800 else if(assembleMode ==
"Rhs"){
802 MultiVectorPtr_Type resVecUnique_d = Teuchos::rcp(
new MultiVector_Type( domainVec_.at(FElocSolid)->getMapVecFieldUnique(), 1 ) );
803 MultiVectorPtr_Type resVecUnique_c = Teuchos::rcp(
new MultiVector_Type( domainVec_.at(FElocChem)->getMapUnique(), 1 ) );
805 resVecUnique_d->putScalar(0.);
806 resVecUnique_c->putScalar(0.);
808 resVecUnique_d->exportFromVector( resVec_d,
true,
"Add" );
809 resVecUnique_c->exportFromVector( resVec_c,
true,
"Add" );
811 resVec->addBlock(resVecUnique_d,0);
812 resVec->addBlock(resVecUnique_c,1);
814 else if(assembleMode ==
"MassMatrix"){
815 A->getBlock(0,0)->fillComplete();
821template <
class SC,
class LO,
class GO,
class NO>
823 std::string FETypeChem,
824 std::string FETypeSolid,
828 MultiVectorPtr_Type c_rep,
829 MultiVectorPtr_Type d_rep,
830 BlockMatrixPtr_Type &A,
833 BlockMultiVectorPtr_Type &resVec,
835 ParameterListPtr_Type params,
836 std::string assembleMode,
837 bool callFillComplete,
840 if((FETypeChem !=
"P2") || (FETypeSolid !=
"P2") || dim != 3)
841 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"No AceGen Implementation available for Discretization and Dimension." );
842 if((blockRow != blockCol) && blockRow != 0)
843 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Block assemblyDeformDiffu AceGEN Version only implemented for 0,0 block right now" );
848 ElementsPtr_Type elementsChem= domainVec_.at(FElocSolid)->getElementsC();
850 ElementsPtr_Type elementsSolid = domainVec_.at(FElocSolid)->getElementsC();
856 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FElocSolid)->getPointsRepeated();
860 MapConstPtr_Type mapSolid = domainVec_.at(FElocSolid)->getMapRepeated();
862 vec_dbl_Type solution_c;
863 vec_dbl_Type solution_d;
865 vec_dbl_ptr_Type rhsVec;
870 if(FETypeChem ==
"P2"){
875 if(FETypeChem ==
"P2")
879 if(FETypeSolid ==
"P2")
884 if(FETypeSolid ==
"P2")
887 tuple_disk_vec_ptr_Type problemDisk = Teuchos::rcp(
new tuple_disk_vec_Type(0));
888 tuple_ssii_Type chem (
"Chemistry",FETypeChem,dofsChem,numChem);
889 tuple_ssii_Type solid (
"Solid",FETypeSolid,dofsSolid,numSolid);
890 problemDisk->push_back(solid);
891 problemDisk->push_back(chem);
893 std::string SCIModel = params->sublist(
"Parameter").get(
"Structure Model",
"SCI_simple");
895 if(assemblyFEElements_.size()== 0){
896 initAssembleFEElements(SCIModel,problemDisk,elementsChem, params,pointsRep,domainVec_.at(FElocSolid)->getElementMap());
898 else if(assemblyFEElements_.size() != elementsChem->numberElements())
899 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Number Elements not the same as number assembleFE elements." );
904 MultiVectorPtr_Type resVec_d = Teuchos::rcp(
new MultiVector_Type( domainVec_.at(FElocSolid)->getMapVecFieldRepeated(), 1 ) );
906 BlockMultiVectorPtr_Type resVecRep = Teuchos::rcp(
new BlockMultiVector_Type( 1) );
907 resVecRep->addBlock(resVec_d,0);
910 for (UN T=0; T<assemblyFEElements_.size(); T++) {
911 vec_dbl_Type solution(0);
913 solution_c = getSolution(elementsChem->getElement(T).getVectorNodeList(), c_rep,dofsChem);
914 solution_d = getSolution(elementsSolid->getElement(T).getVectorNodeList(), d_rep,dofsSolid);
917 solution.insert( solution.end(), solution_d.begin(), solution_d.end() );
918 solution.insert( solution.end(), solution_c.begin(), solution_c.end() );
920 assemblyFEElements_[T]->updateSolution(solution);
922 SmallMatrixPtr_Type elementMatrix;
924 if(assembleMode ==
"Jacobian"){
925 assemblyFEElements_[T]->assembleJacobian();
927 elementMatrix = assemblyFEElements_[T]->getJacobian();
929 assemblyFEElements_[T]->advanceNewtonStep();
930 addFeBlock(A, elementMatrix, elementsSolid->getElement(T), mapSolid, 0, 0, problemDisk);
933 if(assembleMode ==
"Rhs"){
934 assemblyFEElements_[T]->assembleRHS();
935 rhsVec = assemblyFEElements_[T]->getRHS();
936 addFeBlockMv(resVecRep, rhsVec, elementsSolid->getElement(T), dofsSolid);
945 if ( assembleMode !=
"Rhs"){
946 A->getBlock(0,0)->fillComplete();
952 if(assembleMode ==
"Rhs"){
954 MultiVectorPtr_Type resVecUnique_d = Teuchos::rcp(
new MultiVector_Type( domainVec_.at(FElocSolid)->getMapVecFieldUnique(), 1 ) );
957 resVecUnique_d->putScalar(0.);
960 resVecUnique_d->exportFromVector( resVec_d,
true,
"Add" );
963 resVec->addBlock(resVecUnique_d,0);
981template <
class SC,
class LO,
class GO,
class NO>
982void FE<SC,LO,GO,NO>::addFeBlockMatrix(BlockMatrixPtr_Type &A, SmallMatrixPtr_Type elementMatrix,
FiniteElement element1,
FiniteElement element2, MapConstPtr_Type mapFirstRow,MapConstPtr_Type mapSecondRow, tuple_disk_vec_ptr_Type problemDisk){
984 int numDisk = problemDisk->size();
986 int dofs1 = std::get<2>(problemDisk->at(0));
987 int dofs2 = std::get<2>(problemDisk->at(1));
989 int numNodes1 = std::get<3>(problemDisk->at(0));
990 int numNodes2=std::get<3>(problemDisk->at(1));
992 int dofsBlock1 = dofs1*numNodes1;
993 int dofsBlock2 = dofs2*numNodes2;
995 Teuchos::Array<SC> value1( numNodes1, 0. );
996 Teuchos::Array<GO> columnIndices1( numNodes1, 0 );
998 Teuchos::Array<SC> value2( numNodes2, 0. );
999 Teuchos::Array<GO> columnIndices2( numNodes2, 0 );
1001 for (UN i=0; i < numNodes1 ; i++) {
1002 for(
int di=0; di<dofs1; di++){
1003 GO row =GO (dofs1* mapFirstRow->getGlobalElement( element1.getNode(i) )+di);
1004 for(
int d=0; d<dofs1; d++){
1005 for (UN j=0; j < columnIndices1.size(); j++){
1006 columnIndices1[j] = GO ( dofs1 * mapFirstRow->getGlobalElement( element1.getNode(j) ) + d );
1007 value1[j] = (*elementMatrix)[dofs1*i+di][dofs1*j+d];
1009 A->getBlock(0,0)->insertGlobalValues( row, columnIndices1(), value1() );
1013 int offset= numNodes1*dofs1;
1016 Teuchos::Array<SC> value( 1, 0. );
1017 Teuchos::Array<GO> columnIndex( 1, 0 );
1018 for (UN i=0; i < numNodes2 ; i++) {
1019 for(
int di=0; di<dofs2; di++){
1020 GO row =GO (dofs2* mapSecondRow->getGlobalElement( element2.getNode(i) )+di);
1021 for(
int d=0; d<dofs2; d++){
1022 for (UN j=0; j < columnIndices2.size(); j++){
1023 double tmpValue = (*elementMatrix)[offset+dofs2*i+di][offset+dofs2*j+d];
1024 if(std::fabs(tmpValue) > 1.e-13){
1025 columnIndex[0] = GO ( dofs2 * mapSecondRow->getGlobalElement( element2.getNode(j) ) + d );
1026 value[0] = tmpValue;
1027 A->getBlock(1,1)->insertGlobalValues( row, columnIndex(), value() );
1035 for (UN i=0; i < numNodes1; i++){
1036 for(
int di=0; di<dofs1; di++){
1037 GO row =GO (dofs1* mapFirstRow->getGlobalElement( element1.getNode(i) )+di);
1038 for(
int d=0; d<dofs2; d++){
1039 for (UN j=0; j < numNodes2 ; j++) {
1040 value2[j] = (*elementMatrix)[i*dofs1+di][offset+j*dofs2+d];
1041 columnIndices2[j] =GO (dofs2* mapSecondRow->getGlobalElement( element2.getNode(j) )+d);
1043 A->getBlock(0,1)->insertGlobalValues( row, columnIndices2(), value2() );
1048 for (UN j=0; j < numNodes2; j++){
1049 for(
int di=0; di<dofs2; di++){
1050 GO row = GO (dofs2* mapSecondRow->getGlobalElement( element2.getNode(j) ) +di );
1051 for(
int d=0; d<dofs1; d++){
1052 for (UN i=0; i < numNodes1 ; i++) {
1053 value1[i] = (*elementMatrix)[offset+j*dofs2+di][dofs1*i+d];
1054 columnIndices1[i] =GO (dofs1* mapFirstRow->getGlobalElement( element1.getNode(i) )+d);
1056 A->getBlock(1,0)->insertGlobalValues( row, columnIndices1(), value1() );
1077template <
class SC,
class LO,
class GO,
class NO>
1079 std::string FETypeVelocity,
1080 std::string FETypePressure,
1084 MultiVectorPtr_Type u_rep,
1085 MultiVectorPtr_Type p_rep,
1086 BlockMatrixPtr_Type &A,
1087 BlockMultiVectorPtr_Type &resVec,
1088 SmallMatrix_Type coeff,
1089 ParameterListPtr_Type params,
1091 std::string assembleMode,
1092 bool callFillComplete,
1096 UN FElocVel = checkFE(dim,FETypeVelocity);
1097 UN FElocPres = checkFE(dim,FETypePressure);
1099 ElementsPtr_Type elements = domainVec_.at(FElocVel)->getElementsC();
1101 ElementsPtr_Type elementsPres = domainVec_.at(FElocPres)->getElementsC();
1103 int dofsElement = elements->getElement(0).getVectorNodeList().size();
1105 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FElocVel)->getPointsRepeated();
1107 MapConstPtr_Type mapVel = domainVec_.at(FElocVel)->getMapRepeated();
1109 MapConstPtr_Type mapPres = domainVec_.at(FElocPres)->getMapRepeated();
1111 vec_dbl_Type solution(0);
1112 vec_dbl_Type solution_u;
1113 vec_dbl_Type solution_p;
1115 vec_dbl_ptr_Type rhsVec;
1120 if(FETypeVelocity ==
"P2")
1125 if(FETypeVelocity ==
"P2")
1128 tuple_disk_vec_ptr_Type problemDisk = Teuchos::rcp(
new tuple_disk_vec_Type(0));
1129 tuple_ssii_Type vel (
"Velocity",FETypeVelocity,dofsVelocity,numVelo);
1130 tuple_ssii_Type pres (
"Pressure",FETypePressure,dofsPressure,dim+1);
1131 problemDisk->push_back(vel);
1132 problemDisk->push_back(pres);
1134 if(assemblyFEElements_.size()== 0){
1135 if(params->sublist(
"Material").get(
"Newtonian",
true) ==
false)
1136 initAssembleFEElements(
"GeneralizedNewtonian",problemDisk,elements, params,pointsRep,domainVec_.at(FElocVel)->getElementMap());
1138 initAssembleFEElements(
"NavierStokes",problemDisk,elements, params,pointsRep,domainVec_.at(FElocVel)->getElementMap());
1140 else if(assemblyFEElements_.size() != elements->numberElements())
1141 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Number Elements not the same as number assembleFE elements." );
1145 MultiVectorPtr_Type resVec_u = Teuchos::rcp(
new MultiVector_Type( domainVec_.at(FElocVel)->getMapVecFieldRepeated(), 1 ) );
1146 MultiVectorPtr_Type resVec_p = Teuchos::rcp(
new MultiVector_Type( domainVec_.at(FElocPres)->getMapRepeated(), 1 ) );
1148 BlockMultiVectorPtr_Type resVecRep = Teuchos::rcp(
new BlockMultiVector_Type( 2) );
1149 resVecRep->addBlock(resVec_u,0);
1150 resVecRep->addBlock(resVec_p,1);
1153 for (UN T=0; T<assemblyFEElements_.size(); T++) {
1154 vec_dbl_Type solution(0);
1156 solution_u = getSolution(elements->getElement(T).getVectorNodeList(), u_rep,dofsVelocity);
1157 solution_p = getSolution(elementsPres->getElement(T).getVectorNodeList(), p_rep,dofsPressure);
1159 solution.insert( solution.end(), solution_u.begin(), solution_u.end() );
1160 solution.insert( solution.end(), solution_p.begin(), solution_p.end() );
1162 assemblyFEElements_[T]->updateSolution(solution);
1164 SmallMatrixPtr_Type elementMatrix;
1166 if(assembleMode ==
"Jacobian"){
1167 assemblyFEElements_[T]->assembleJacobian();
1169 elementMatrix = assemblyFEElements_[T]->getJacobian();
1171 assemblyFEElements_[T]->advanceNewtonStep();
1174 addFeBlock(A, elementMatrix, elements->getElement(T), mapVel, 0, 0, problemDisk);
1176 addFeBlockMatrix(A, elementMatrix, elements->getElement(T), elementsPres->getElement(T), mapVel, mapPres, problemDisk);
1178 if(assembleMode ==
"FixedPoint"){
1182 if(params->sublist(
"Material").get(
"Newtonian",
true) ==
false)
1184 AssembleFEGeneralizedNewtonianPtr_Type elTmp = Teuchos::rcp_dynamic_cast<AssembleFEGeneralizedNewtonian_Type>( assemblyFEElements_[T] );
1185 elTmp->assembleFixedPoint();
1186 elementMatrix = elTmp->getFixedPointMatrix();
1190 AssembleFENavierStokesPtr_Type elTmp = Teuchos::rcp_dynamic_cast<AssembleFENavierStokes_Type>( assemblyFEElements_[T] );
1191 elTmp->assembleFixedPoint();
1192 elementMatrix = elTmp->getFixedPointMatrix();
1196 assemblyFEElements_[T]->advanceNewtonStep();
1199 addFeBlock(A, elementMatrix, elements->getElement(T), mapVel, 0, 0, problemDisk);
1201 addFeBlockMatrix(A, elementMatrix, elements->getElement(T), elementsPres->getElement(T),mapVel, mapPres, problemDisk);
1204 if(assembleMode ==
"Rhs"){
1205 AssembleFENavierStokesPtr_Type elTmp = Teuchos::rcp_dynamic_cast<AssembleFENavierStokes_Type>(assemblyFEElements_[T] );
1206 elTmp->setCoeff(coeff);
1207 assemblyFEElements_[T]->assembleRHS();
1208 rhsVec = assemblyFEElements_[T]->getRHS();
1209 addFeBlockMv(resVecRep, rhsVec, elements->getElement(T),elementsPres->getElement(T), dofsVelocity,dofsPressure);
1214 if (callFillComplete && reAssemble && assembleMode !=
"Rhs" )
1215 A->getBlock(0,0)->fillComplete( domainVec_.at(FElocVel)->getMapVecFieldUnique(),domainVec_.at(FElocVel)->getMapVecFieldUnique());
1216 else if(callFillComplete && !reAssemble && assembleMode !=
"Rhs"){
1217 A->getBlock(0,0)->fillComplete();
1218 A->getBlock(1,0)->fillComplete(domainVec_.at(FElocVel)->getMapVecFieldUnique(),domainVec_.at(FElocPres)->getMapUnique());
1219 A->getBlock(0,1)->fillComplete(domainVec_.at(FElocPres)->getMapUnique(),domainVec_.at(FElocVel)->getMapVecFieldUnique());
1220 A->getBlock(1,1)->fillComplete();
1223 if(assembleMode ==
"Rhs"){
1225 MultiVectorPtr_Type resVecUnique_u = Teuchos::rcp(
new MultiVector_Type( domainVec_.at(FElocVel)->getMapVecFieldUnique(), 1 ) );
1226 MultiVectorPtr_Type resVecUnique_p = Teuchos::rcp(
new MultiVector_Type( domainVec_.at(FElocPres)->getMapUnique(), 1 ) );
1228 resVecUnique_u->putScalar(0.);
1229 resVecUnique_p->putScalar(0.);
1231 resVecUnique_u->exportFromVector( resVec_u,
true,
"Add" );
1232 resVecUnique_p->exportFromVector( resVec_p,
true,
"Add" );
1234 resVec->addBlock(resVecUnique_u,0);
1235 resVec->addBlock(resVecUnique_p,1);
1252template <
class SC,
class LO,
class GO,
class NO>
1254 std::string FETypeVelocity,
1255 std::string FETypePressure,
1258 MultiVectorPtr_Type u_rep,
1259 MultiVectorPtr_Type p_rep,
1260 ParameterListPtr_Type params){
1263 UN FElocVel = checkFE(dim,FETypeVelocity);
1264 UN FElocPres = checkFE(dim,FETypePressure);
1266 ElementsPtr_Type elements = domainVec_.at(FElocVel)->getElementsC();
1267 ElementsPtr_Type elementsPres = domainVec_.at(FElocPres)->getElementsC();
1269 vec_dbl_Type solution(0);
1270 vec_dbl_Type solution_u;
1271 vec_dbl_Type solution_p;
1272 vec_dbl_Type solution_viscosity;
1275 MultiVectorPtr_Type Sol_viscosity = Teuchos::rcp(
new MultiVector_Type( domainVec_.at(FElocVel)->getElementMap(), 1 ) );
1276 BlockMultiVectorPtr_Type visco_output = Teuchos::rcp(
new BlockMultiVector_Type(1) );
1277 visco_output->addBlock(Sol_viscosity,0);
1280 for (UN T=0; T<assemblyFEElements_.size(); T++) {
1282 vec_dbl_Type solution(0);
1283 solution_u = getSolution(elements->getElement(T).getVectorNodeList(), u_rep,dofsVelocity);
1284 solution_p = getSolution(elementsPres->getElement(T).getVectorNodeList(), p_rep,dofsPressure);
1286 solution.insert( solution.end(), solution_u.begin(), solution_u.end() );
1287 solution.insert( solution.end(), solution_p.begin(), solution_p.end() );
1289 assemblyFEElements_[T]->updateSolution(solution);
1291 assemblyFEElements_[T]->computeLocalconstOutputField();
1292 solution_viscosity = assemblyFEElements_[T]->getLocalconstOutputField();
1294 Teuchos::ArrayRCP<SC> resArray_block = visco_output->getBlockNonConst(0)->getDataNonConst(0);
1295 resArray_block[T] = solution_viscosity[0];
1299 this->const_output_fields= visco_output;
1317template <
class SC,
class LO,
class GO,
class NO>
1318void FE<SC,LO,GO,NO>::addFeBlockMv(BlockMultiVectorPtr_Type &res, vec_dbl_ptr_Type rhsVec,
FiniteElement elementBlock1,
FiniteElement elementBlock2,
int dofs1,
int dofs2 ){
1320 Teuchos::ArrayRCP<SC> resArray_block1 = res->getBlockNonConst(0)->getDataNonConst(0);
1322 Teuchos::ArrayRCP<SC> resArray_block2 = res->getBlockNonConst(1)->getDataNonConst(0);
1324 vec_LO_Type nodeList_block1 = elementBlock1.getVectorNodeList();
1326 vec_LO_Type nodeList_block2 = elementBlock2.getVectorNodeList();
1328 for(
int i=0; i< nodeList_block1.size() ; i++){
1329 for(
int d=0; d<dofs1; d++){
1330 resArray_block1[nodeList_block1[i]*dofs1+d] += (*rhsVec)[i*dofs1+d];
1333 int offset = nodeList_block1.size()*dofs1;
1335 for(
int i=0; i < nodeList_block2.size(); i++){
1336 for(
int d=0; d<dofs2; d++)
1337 resArray_block2[nodeList_block2[i]*dofs2+d] += (*rhsVec)[i*dofs2+d+offset];
1355template <
class SC,
class LO,
class GO,
class NO>
1356void FE<SC,LO,GO,NO>::addFeBlock(BlockMatrixPtr_Type &A, SmallMatrixPtr_Type elementMatrix, FiniteElement element, MapConstPtr_Type mapRow,
int row,
int column, tuple_disk_vec_ptr_Type problemDisk){
1358 int dofs1 = std::get<2>(problemDisk->at(row));
1360 int numNodes1 = std::get<3>(problemDisk->at(row));
1362 int dofsBlock1 = dofs1*numNodes1;
1364 Teuchos::Array<SC> value( numNodes1, 0. );
1365 Teuchos::Array<GO> columnIndices( numNodes1, 0 );
1367 for (UN i=0; i < numNodes1 ; i++) {
1368 for(
int di=0; di<dofs1; di++){
1369 GO rowID =GO (dofs1* mapRow->getGlobalElement( element.getNode(i) )+di);
1370 for(
int d=0; d<dofs1; d++){
1371 for (UN j=0; j < columnIndices.size(); j++){
1372 columnIndices[j] = GO ( dofs1 * mapRow->getGlobalElement( element.getNode(j) ) + d );
1373 value[j] = (*elementMatrix)[dofs1*i+di][dofs1*j+d];
1375 A->getBlock(row,column)->insertGlobalValues( rowID, columnIndices(), value() );
1391template <
class SC,
class LO,
class GO,
class NO>
1392void FE<SC,LO,GO,NO>::initAssembleFEElements(std::string elementType,tuple_disk_vec_ptr_Type problemDisk,ElementsPtr_Type elements, ParameterListPtr_Type params,vec2D_dbl_ptr_Type pointsRep, MapConstPtr_Type elementMap){
1394 vec2D_dbl_Type nodes;
1395 for (UN T=0; T<elements->numberElements(); T++) {
1397 nodes = getCoordinates(elements->getElement(T).getVectorNodeList(), pointsRep);
1399 AssembleFEFactory<SC,LO,GO,NO> assembleFEFactory;
1401 AssembleFEPtr_Type assemblyFE = assembleFEFactory.build(elementType,elements->getElement(T).getFlag(),nodes, params,problemDisk);
1403 assemblyFE->setGlobalElementID(elementMap->getGlobalElement(T));
1405 assemblyFEElements_.push_back(assemblyFE);
1421template <
class SC,
class LO,
class GO,
class NO>
1422vec2D_dbl_Type FE<SC,LO,GO,NO>::getCoordinates(vec_LO_Type localIDs, vec2D_dbl_ptr_Type points){
1424 vec2D_dbl_Type coordinates(0,vec_dbl_Type( points->at(0).size()));
1425 for(
int i=0; i < localIDs.size() ; i++){
1426 coordinates.push_back(points->at(localIDs[i]));
1442template <
class SC,
class LO,
class GO,
class NO>
1443vec_dbl_Type FE<SC,LO,GO,NO>::getSolution(vec_LO_Type localIDs, MultiVectorPtr_Type u_rep,
int dofsVelocity){
1445 Teuchos::ArrayRCP<SC> uArray = u_rep->getDataNonConst(0);
1447 vec_dbl_Type solution(0);
1448 for(
int i=0; i < localIDs.size() ; i++){
1449 for(
int d=0; d<dofsVelocity; d++)
1450 solution.push_back(uArray[localIDs[i]*dofsVelocity+d]);
1457template <
class SC,
class LO,
class GO,
class NO>
1458void FE<SC,LO,GO,NO>::applyBTinv( vec3D_dbl_ptr_Type& dPhiIn,
1459 vec3D_dbl_Type& dPhiOut,
1460 const SmallMatrix<SC>& Binv){
1461 UN dim = Binv.size();
1462 for (UN w=0; w<dPhiIn->size(); w++){
1463 for (UN i=0; i < dPhiIn->at(w).size(); i++) {
1464 for (UN d1=0; d1<dim; d1++) {
1465 for (UN d2=0; d2<dim; d2++) {
1466 dPhiOut[w][i][d1] += dPhiIn->at(w).at(i).at(d2) * Binv[d2][d1];
1473template <
class SC,
class LO,
class GO,
class NO>
1474void FE<SC,LO,GO,NO>::assemblyEmptyMatrix(MatrixPtr_Type &A){
1477template <
class SC,
class LO,
class GO,
class NO>
1478void FE<SC,LO,GO,NO>::assemblyIdentity(MatrixPtr_Type &A){
1479 Teuchos::Array<SC> value(1, Teuchos::ScalarTraits<SC>::one() );
1480 Teuchos::Array<GO> index(1);
1481 MapConstPtr_Type map = A->getMap();
1482 for (
int i=0; i<A->getNodeNumRows(); i++) {
1483 index[0] = map->getGlobalElement( i );
1484 A->insertGlobalValues( index[0], index(), value() );
1757template <
class SC,
class LO,
class GO,
class NO>
1762 BlockMatrixPtr_Type &A,
1763 bool callFillComplete,
1765 ParameterListPtr_Type params = Teuchos::getParametersFromXmlFile(
"parametersProblemLaplace.xml");
1767 UN FEloc = checkFE(dim,FEType);
1768 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
1769 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
1770 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
1771 vec2D_dbl_Type nodes;
1778 tuple_disk_vec_ptr_Type problemDisk = Teuchos::rcp(
new tuple_disk_vec_Type(0));
1779 tuple_ssii_Type vel (
"Laplace",FEType,dofs,numNodes);
1780 problemDisk->push_back(vel);
1781 if(assemblyFEElements_.size()== 0)
1782 initAssembleFEElements(
"Laplace",problemDisk,elements, params,pointsRep,domainVec_.at(0)->getElementMap());
1783 else if(assemblyFEElements_.size() != elements->numberElements())
1784 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Number Elements not the same as number assembleFE elements." );
1785 for (UN T=0; T<elements->numberElements(); T++) {
1786 assemblyFEElements_[T]->assembleJacobian();
1787 SmallMatrixPtr_Type elementMatrix = assemblyFEElements_[T]->getJacobian();
1788 addFeBlock(A, elementMatrix, elements->getElement(T), map, 0, 0, problemDisk);
1791 if(callFillComplete)
1792 A->getBlock(0,0)->fillComplete();
1796template <
class SC,
class LO,
class GO,
class NO>
1797void FE<SC,LO,GO,NO>::assemblyLaplaceDiffusion(
int dim,
1801 vec2D_dbl_Type diffusionTensor,
1802 bool callFillComplete,
1804 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
1806 if (FELocExternal<0)
1807 FEloc = checkFE(dim,FEType);
1809 FEloc = FELocExternal;
1811 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
1813 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
1815 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
1817 vec3D_dbl_ptr_Type dPhi;
1818 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
1830 vec_dbl_Type v_i(dim);
1831 vec_dbl_Type v_j(dim);
1836 if(diffusionTensor.size()==0 || diffusionTensor.size() < dim ){
1837 vec2D_dbl_Type diffusionTensor(3,vec_dbl_Type(3,0));
1838 for(
int i=0; i< dim; i++){
1839 diffusionTensor[i][i]=1.;
1843 for(
int i=0; i< dim; i++){
1844 for(
int j=0; j<dim; j++){
1845 diffusionT[i][j]=diffusionTensor[i][j];
1850 for (UN T=0; T<elements->numberElements(); T++) {
1852 Helper::buildTransformation(elements->getElement(T).getVectorNodeList(), pointsRep, B, FEType);
1853 detB = B.computeInverse(Binv);
1854 absDetB = std::fabs(detB);
1856 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
1857 applyBTinv( dPhi, dPhiTrans, Binv );
1859 vec3D_dbl_Type dPhiTransDiff( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
1860 applyDiff( dPhiTrans, dPhiTransDiff, diffusionT );
1862 for (UN i=0; i < dPhiTrans[0].size(); i++) {
1863 Teuchos::Array<SC> value( dPhiTrans[0].size(), 0. );
1864 Teuchos::Array<GO> indices( dPhiTrans[0].size(), 0 );
1866 for (UN j=0; j < value.size(); j++) {
1867 for (UN w=0; w<dPhiTrans.size(); w++) {
1868 for (UN d=0; d<dim; d++){
1869 value[j] += weights->at(w) * dPhiTrans[w][i][d] * dPhiTransDiff[w][j][d];
1872 value[j] *= absDetB;
1873 indices[j] = map->getGlobalElement( elements->getElement(T).getNode(j) );
1874 if (setZeros_ && std::fabs(value[j]) < myeps_) {
1878 GO row = map->getGlobalElement( elements->getElement(T).getNode(i) );
1880 A->insertGlobalValues( row, indices(), value() );
1885 if (callFillComplete)
1890template <
class SC,
class LO,
class GO,
class NO>
1891void FE<SC,LO,GO,NO>::applyDiff( vec3D_dbl_Type& dPhiIn,
1892 vec3D_dbl_Type& dPhiOut,
1893 SmallMatrix<SC>& diffT){
1894 UN dim = diffT.size();
1895 for (UN w=0; w<dPhiIn.size(); w++){
1896 for (UN i=0; i < dPhiIn[w].size(); i++) {
1897 for (UN d1=0; d1<dim; d1++) {
1898 for (UN d2=0; d2<dim; d2++) {
1899 dPhiOut[w][i][d1] += dPhiIn[w][i][d2]* diffT[d2][d1];
1906template <
class SC,
class LO,
class GO,
class NO>
1907void FE<SC,LO,GO,NO>::assemblyAceGenTPM( MatrixPtr_Type &A00,
1908 MatrixPtr_Type &A01,
1909 MatrixPtr_Type &A10,
1910 MatrixPtr_Type &A11,
1911 MultiVectorPtr_Type &F0,
1912 MultiVectorPtr_Type &F1,
1913 MapPtr_Type &mapRepeated1,
1914 MapPtr_Type &mapRepeated2,
1915 ParameterListPtr_Type parameterList,
1916 MultiVectorPtr_Type u_repeatedNewton,
1917 MultiVectorPtr_Type p_repeatedNewton,
1918 MultiVectorPtr_Type u_repeatedTime,
1919 MultiVectorPtr_Type p_repeatedTime,
1925 std::string tpmType = parameterList->sublist(
"Parameter").get(
"TPM Type",
"Biot");
1927 int dim = domainVec_[0]->getDimension();
1929 int ic = -1;
int ng = -1;
1933 ElementsPtr_Type elements1 = domainVec_[0]->getElementsC();
1934 ElementsPtr_Type elements2 = domainVec_[1]->getElementsC();
1944 for (UN T=0; T<elements1->numberElements(); T++)
1945 ed_.push_back( Teuchos::rcp(
new DataElement( sizeED )) );
1948 std::vector<ElementSpec> es_vec( parameterList->sublist(
"Parameter").get(
"Number of materials",1) ,
ElementSpec());
1949 vec2D_dbl_Type dataVec( parameterList->sublist(
"Parameter").get(
"Number of materials",1), vec_dbl_Type(6,0.) );
1951 for (
int i=0; i<dataVec.size(); i++) {
1952 if (tpmType ==
"Biot") {
1954 dataVec[i][0] = parameterList->sublist(
"Timestepping Parameter").get(
"Newmark gamma",0.5);
1955 dataVec[i][1] = parameterList->sublist(
"Timestepping Parameter").get(
"Newmark beta",0.25);
1956 dataVec[i][2] = parameterList->sublist(
"Parameter").get(
"initial volume fraction solid material"+std::to_string(i+1),0.5);
1957 dataVec[i][3] = parameterList->sublist(
"Parameter").get(
"Darcy parameter material"+std::to_string(i+1),1.e-2);
1958 dataVec[i][4] = parameterList->sublist(
"Parameter").get(
"Youngs modulus material"+std::to_string(i+1),60.e6);
1959 dataVec[i][5] = parameterList->sublist(
"Parameter").get(
"Poisson ratio material"+std::to_string(i+1),0.3);
1962 dataVec[i].resize(12);
1963 dataVec[i][0] = parameterList->sublist(
"Parameter").get(
"Youngs modulus material"+std::to_string(i+1),2.e5);
1964 dataVec[i][1] = parameterList->sublist(
"Parameter").get(
"Poisson ratio material"+std::to_string(i+1),0.3);
1967 dataVec[i][4] = parameterList->sublist(
"Parameter").get(
"body force z"+std::to_string(i+1),0.);;
1968 dataVec[i][5] = parameterList->sublist(
"Parameter").get(
"initial volume fraction solid material"+std::to_string(i+1),0.67);
1969 dataVec[i][6] = parameterList->sublist(
"Parameter").get(
"Darcy parameter material"+std::to_string(i+1),0.01);
1970 dataVec[i][7] = 2000.;
1971 dataVec[i][8] = 1000.;
1972 dataVec[i][9] = 9.81;
1973 dataVec[i][10] = parameterList->sublist(
"Timestepping Parameter").get(
"Newmark gamma",0.5);
1974 dataVec[i][11] = parameterList->sublist(
"Timestepping Parameter").get(
"Newmark beta",0.25);
1979 else if (tpmType ==
"Biot-StVK") {
1980 dataVec[i][0] = parameterList->sublist(
"Parameter").get(
"Youngs modulus material"+std::to_string(i+1),60.e6);
1981 dataVec[i][1] = parameterList->sublist(
"Parameter").get(
"Poisson ratio material"+std::to_string(i+1),0.3);
1982 dataVec[i][2] = parameterList->sublist(
"Parameter").get(
"initial volume fraction solid material"+std::to_string(i+1),0.5);
1983 dataVec[i][3] = parameterList->sublist(
"Parameter").get(
"Darcy parameter material"+std::to_string(i+1),1.e-2);
1984 dataVec[i][4] = parameterList->sublist(
"Timestepping Parameter").get(
"Newmark gamma",0.5);
1985 dataVec[i][5] = parameterList->sublist(
"Timestepping Parameter").get(
"Newmark beta",0.25);
1989 for (
int i=0; i<es_vec.size(); i++){
1990 if(tpmType ==
"Biot"){
1992 this->SMTSetElSpecBiot(&es_vec[i] ,&idata, ic, ng, dataVec[i]);
1994 this->SMTSetElSpecBiot3D(&es_vec[i] ,&idata, ic, ng, dataVec[i]);
1996 else if(tpmType ==
"Biot-StVK")
1997 this->SMTSetElSpecBiotStVK(&es_vec[i] ,&idata, ic, ng, dataVec[i]);
1999 LO elementSizePhase = elements1->nodesPerElement();
2000 LO sizePhase = dim * elementSizePhase;
2001 LO sizePressure = elements2->nodesPerElement();
2002 GO sizePhaseGlobal = A00->getMap()->getMaxAllGlobalIndex()+1;
2003 int workingVectorSize;
2004 if(tpmType ==
"Biot"){
2006 workingVectorSize = 5523;
2008 workingVectorSize = 1817;
2010 else if(tpmType ==
"Biot-StVK")
2011 workingVectorSize = 5223;
2013 double* v =
new double [workingVectorSize];
2024 std::vector<double> rdata(RD_TimeIncrement+1, 0.);
2026 rdata[RD_TimeIncrement] = parameterList->sublist(
"Timestepping Parameter").get(
"dt",0.01);
2032 for (
int i=0; i<elementSizePhase + sizePressure; i++){
2036 int numNodes = elementSizePhase + sizePressure;
2038 vec2D_dbl_Type xFull( numNodes, vec_dbl_Type(dim,0.) );
2039 vec2D_dbl_Type atFull( numNodes, vec_dbl_Type(dim,0.) );
2040 vec2D_dbl_Type apFull( numNodes, vec_dbl_Type(dim,0.) );
2042 for (
int i=0; i<elementSizePhase + sizePressure; i++) {
2043 nd[i]->X = &(xFull[i][0]);
2044 nd[i]->at = &(atFull[i][0]);
2045 nd[i]->ap = &(apFull[i][0]);
2048 GO offsetMap1 = dim * mapRepeated1->getMaxAllGlobalIndex()+1;
2049 vec2D_dbl_ptr_Type pointsRepU = domainVec_.at(0)->getPointsRepeated();
2050 vec2D_dbl_ptr_Type pointsRepP = domainVec_.at(1)->getPointsRepeated();
2052 Teuchos::ArrayRCP< const SC > uArrayNewton = u_repeatedNewton->getData(0);
2053 Teuchos::ArrayRCP< const SC > pArrayNewton = p_repeatedNewton->getData(0);
2054 Teuchos::ArrayRCP< const SC > uArrayTime = u_repeatedTime->getData(0);
2055 Teuchos::ArrayRCP< const SC > pArrayTime = p_repeatedTime->getData(0);
2057 double** mat =
new double*[sizePhase+sizePressure];
2058 for (
int i=0; i<sizePhase+sizePressure; i++){
2059 mat[i] =
new double[sizePhase+sizePressure];
2062 Teuchos::ArrayRCP<SC> fValues0 = F0->getDataNonConst(0);
2063 Teuchos::ArrayRCP<SC> fValues1 = F1->getDataNonConst(0);
2068 for (UN T=0; T<elements1->numberElements(); T++) {
2070 std::vector<double> tmpHp = ed_[T]->getHp();
2071 std::vector<double> tmpHt = ed_[T]->getHt();
2075 int materialFlag = elements1->getElement(T).getFlag();
2076 TEUCHOS_TEST_FOR_EXCEPTION( materialFlag>es_vec.size()-1, std::runtime_error,
"There are not enought material parameters initialized." ) ;
2079 for (
int j=0; j<elementSizePhase; j++) {
2080 for (
int d=0; d<dim; d++) {
2081 LO index = dim * elements1->getElement(T).getNode(j)+d;
2082 atFull[j][d] = uArrayNewton[index];
2083 apFull[j][d] = uArrayTime[index];
2086 for (
int j=0; j<sizePressure; j++) {
2087 LO index = elements2->getElement(T).getNode(j);
2088 atFull[elementSizePhase+j][0] = pArrayNewton[index];
2089 apFull[elementSizePhase+j][0] = pArrayTime[index];
2093 for (
int j=0; j<elementSizePhase; j++ ) {
2094 LO index = elements1->getElement(T).getNode(j);
2095 for (
int d=0; d<dim; d++) {
2096 xFull[j][d] = (*pointsRepU)[index][d];
2099 for (
int j=0; j<sizePressure; j++ ) {
2100 LO index = elements2->getElement(T).getNode(j);
2101 for (
int d=0; d<dim; d++) {
2102 xFull[elementSizePhase+j][d] = (*pointsRepP)[index][d];
2105 vec_dbl_Type p( sizePhase+sizePressure , 0. );
2107 for (
int i=0; i<sizePhase+sizePressure; i++){
2108 for (
int j=0; j<sizePhase+sizePressure; j++)
2112 if(tpmType ==
"Biot"){
2114 this->SKR_Biot( v, &es_vec[materialFlag], &ed, &ns, nd , &rdata[0], &idata, &p[0], mat );
2116 this->SKR_Biot3D( v, &es_vec[materialFlag], &ed, &ns, nd , &rdata[0], &idata, &p[0], mat );
2118 else if(tpmType ==
"Biot-StVK")
2119 this->SKR_Biot_StVK( v, &es_vec[materialFlag], &ed, &ns, nd , &rdata[0], &idata, &p[0], mat );
2122 ed_[T]->setHp( ed.ht );
2127 for (UN i=0; i < sizePhase; i++) {
2128 Teuchos::Array<SC> value00( sizePhase, 0. );
2129 Teuchos::Array<GO> indices00( sizePhase, 0 );
2130 for (UN j=0; j < value00.size(); j++) {
2132 value00[j] = mat[i][j];
2135 LO index = elements1->getElement(T).getNode(tmpJ);
2137 indices00[j] = dim * mapRepeated1->getGlobalElement( index );
2139 indices00[j] = dim * mapRepeated1->getGlobalElement( index ) + 1;
2141 indices00[j] = dim * mapRepeated1->getGlobalElement( index ) + 2;
2144 Teuchos::Array<SC> value01( sizePressure, 0. );
2145 Teuchos::Array<GO> indices01( sizePressure, 0 );
2147 for (UN j=0; j < value01.size(); j++) {
2148 value01[j] = mat[i][sizePhase+j];
2149 LO index = elements2->getElement(T).getNode(j);
2150 indices01[j] = mapRepeated2->getGlobalElement( index );
2155 LO index = elements1->getElement(T).getNode(tmpI);
2157 row = dim * mapRepeated1->getGlobalElement( index );
2159 row = dim * mapRepeated1->getGlobalElement( index ) + 1;
2161 row = dim * mapRepeated1->getGlobalElement( index ) + 2;
2163 A00->insertGlobalValues( row, indices00(), value00() );
2164 A01->insertGlobalValues( row, indices01(), value01() );
2167 fValues0[ dim*index ] += p[ i ];
2169 fValues0[ dim*index+1 ] += p[ i ];
2171 fValues0[ dim*index+2 ] += p[ i ];
2174 for (UN i=0; i < sizePressure; i++) {
2175 Teuchos::Array<SC> value10( sizePhase , 0. );
2176 Teuchos::Array<GO> indices10( sizePhase , 0 );
2177 for (UN j=0; j < value10.size(); j++) {
2178 value10[j] = mat[sizePhase+i][j];
2181 LO index = elements1->getElement(T).getNode(tmpJ);
2183 indices10[j] = dim * mapRepeated1->getGlobalElement( index );
2185 indices10[j] = dim * mapRepeated1->getGlobalElement( index ) + 1;
2187 indices10[j] = dim * mapRepeated1->getGlobalElement( index ) + 2;
2190 Teuchos::Array<SC> value11( sizePressure, 0. );
2191 Teuchos::Array<GO> indices11( sizePressure, 0 );
2192 for (UN j=0; j < value11.size(); j++) {
2193 value11[j] = mat[sizePhase+i][sizePhase+j];
2195 LO index = elements2->getElement(T).getNode(j);
2196 indices11[j] = mapRepeated2->getGlobalElement( index );
2200 LO index2 = elements2->getElement(T).getNode(i);
2201 GO row = mapRepeated2->getGlobalElement( index2 );
2202 A10->insertGlobalValues( row, indices10(), value10() );
2203 A11->insertGlobalValues( row, indices11(), value11() );
2205 fValues1[ index2 ] += p[ sizePhase + i ];
2210 for (
int i=0; i<sizePhase+sizePressure; i++)
2216 for (
int i=0; i<elementSizePhase+sizePressure; i++)
2222 A00->fillComplete( A00->getMap(
"row"), A00->getMap(
"row") );
2223 A01->fillComplete( A10->getMap(
"row"), A00->getMap(
"row") );
2224 A10->fillComplete( A00->getMap(
"row"), A10->getMap(
"row") );
2225 A11->fillComplete( A10->getMap(
"row"), A10->getMap(
"row") );
2229template <
class SC,
class LO,
class GO,
class NO>
2230void FE<SC,LO,GO,NO>::assemblyMass(
int dim,
2232 std::string fieldType,
2234 bool callFillComplete){
2236 TEUCHOS_TEST_FOR_EXCEPTION( FEType ==
"P0", std::logic_error,
"Not implemented for P0" );
2237 UN FEloc = checkFE(dim,FEType);
2238 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
2240 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
2242 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
2244 vec2D_dbl_ptr_Type phi;
2245 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
2248 UN deg = 2*Helper::determineDegree(dim,FEType,Helper::Deriv0);
2250 Helper::getPhi( phi, weights, dim, FEType, deg );
2254 SmallMatrix<SC> B(dim);
2256 vec_dbl_Type v_i(dim);
2257 vec_dbl_Type v_j(dim);
2259 for (UN T=0; T<elements->numberElements(); T++) {
2261 Helper::buildTransformation(elements->getElement(T).getVectorNodeList(), pointsRep, B);
2262 detB = B.computeDet( );
2263 absDetB = std::fabs(detB);
2265 for (UN i=0; i < phi->at(0).size(); i++) {
2266 Teuchos::Array<SC> value( phi->at(0).size(), 0. );
2267 Teuchos::Array<GO> indices( phi->at(0).size(), 0 );
2268 for (UN j=0; j < value.size(); j++) {
2269 for (UN w=0; w<phi->size(); w++) {
2270 value[j] += weights->at(w) * (*phi)[w][i] * (*phi)[w][j];
2273 value[j] *= absDetB;
2274 if (!fieldType.compare(
"Scalar")) {
2275 indices[j] = map->getGlobalElement( elements->getElement(T).getNode(j) );
2279 if (!fieldType.compare(
"Scalar")) {
2280 GO row = map->getGlobalElement( elements->getElement(T).getNode(i) );
2281 A->insertGlobalValues( row, indices(), value() );
2283 else if (!fieldType.compare(
"Vector")) {
2284 for (UN d=0; d<dim; d++) {
2285 for (
int j=0; j<indices.size(); j++) {
2286 indices[j] = (GO) ( dim * map->getGlobalElement( elements->getElement(T).getNode(j) ) + d );
2288 GO row = (GO) ( dim * map->getGlobalElement( elements->getElement(T).getNode(i) ) + d );
2289 A->insertGlobalValues( row, indices(), value() );
2293 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Specify valid vieldType for assembly of mass matrix.");
2298 if (callFillComplete)
2306template <
class SC,
class LO,
class GO,
class NO>
2307void FE<SC,LO,GO,NO>::assemblyMass(
int dim,
2309 std::string fieldType,
2312 bool callFillComplete){
2314 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
2316 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
2318 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
2320 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
2322 vec2D_dbl_ptr_Type phi;
2323 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
2326 UN deg = 2*Helper::determineDegree(dim,FEType,Helper::Deriv0);
2328 Helper::getPhi( phi, weights, dim, FEType, deg );
2332 SmallMatrix<SC> B(dim);
2334 vec_dbl_Type v_i(dim);
2335 vec_dbl_Type v_j(dim);
2337 for (UN T=0; T<elements->numberElements(); T++) {
2339 Helper::buildTransformation(elements->getElement(T).getVectorNodeList(), pointsRep, B);
2340 detB = B.computeDet( );
2341 absDetB = std::fabs(detB);
2343 for (UN i=0; i < phi->at(0).size(); i++) {
2344 Teuchos::Array<SC> value( phi->at(0).size(), 0. );
2345 Teuchos::Array<GO> indices( phi->at(0).size(), 0 );
2346 for (UN j=0; j < value.size(); j++) {
2347 for (UN w=0; w<phi->size(); w++) {
2348 value[j] += weights->at(w) * (*phi)[w][i] * (*phi)[w][j];
2350 value[j] *= absDetB;
2351 if (!fieldType.compare(
"Scalar")) {
2352 indices[j] = map->getGlobalElement( elements->getElement(T).getNode(j) );
2356 if (!fieldType.compare(
"Scalar")) {
2357 GO row = map->getGlobalElement( elements->getElement(T).getNode(i) );
2358 A->insertGlobalValues( row, indices(), value() );
2360 else if (!fieldType.compare(
"Vector")) {
2361 for (UN d=0; d<dim; d++) {
2362 for (
int j=0; j<indices.size(); j++) {
2363 indices[j] = (GO) ( dim * map->getGlobalElement( elements->getElement(T).getNode(j) ) + d );
2365 GO row = (GO) ( dim * map->getGlobalElement( elements->getElement(T).getNode(i) ) + d );
2366 A->insertGlobalValues( row, indices(), value() );
2370 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Specify valid vieldType for assembly of mass matrix.");
2375 if (callFillComplete)
2380template <
class SC,
class LO,
class GO,
class NO>
2381void FE<SC,LO,GO,NO>::assemblyLaplace(
int dim,
2385 bool callFillComplete,
2387 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
2389 if (FELocExternal<0)
2390 FEloc = checkFE(dim,FEType);
2392 FEloc = FELocExternal;
2394 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
2396 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
2398 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
2400 vec3D_dbl_ptr_Type dPhi;
2401 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
2403 UN deg = 2*Helper::determineDegree(dim,FEType,Helper::Deriv1);
2404 Helper::getDPhi(dPhi, weights, dim, FEType, deg);
2408 SmallMatrix<SC> B(dim);
2409 SmallMatrix<SC> Binv(dim);
2411 vec_dbl_Type v_i(dim);
2412 vec_dbl_Type v_j(dim);
2414 for (UN T=0; T<elements->numberElements(); T++) {
2416 Helper::buildTransformation(elements->getElement(T).getVectorNodeList(), pointsRep, B, FEType);
2417 detB = B.computeInverse(Binv);
2418 absDetB = std::fabs(detB);
2420 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
2421 applyBTinv( dPhi, dPhiTrans, Binv );
2422 for (UN i=0; i < dPhiTrans[0].size(); i++) {
2423 Teuchos::Array<SC> value( dPhiTrans[0].size(), 0. );
2424 Teuchos::Array<GO> indices( dPhiTrans[0].size(), 0 );
2425 for (UN j=0; j < value.size(); j++) {
2426 for (UN w=0; w<dPhiTrans.size(); w++) {
2427 for (UN d=0; d<dim; d++){
2428 value[j] += weights->at(w) * dPhiTrans[w][i][d] * dPhiTrans[w][j][d];
2431 value[j] *= absDetB;
2432 indices[j] = map->getGlobalElement( elements->getElement(T).getNode(j) );
2434 GO row = map->getGlobalElement( elements->getElement(T).getNode(i) );
2436 A->insertGlobalValues( row, indices(), value() );
2441 if (callFillComplete)
2446template <
class SC,
class LO,
class GO,
class NO>
2447void FE<SC,LO,GO,NO>::assemblyLaplaceVecField(
int dim,
2451 bool callFillComplete){
2453 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P1-disc" || FEType ==
"P0",std::logic_error,
"Not implemented for P0 or P1-disc");
2454 UN FEloc = checkFE(dim,FEType);
2456 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
2458 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
2460 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
2462 vec3D_dbl_ptr_Type dPhi;
2463 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
2465 UN deg = 2*Helper::determineDegree(dim,FEType,Helper::Deriv1);
2467 Helper::getDPhi(dPhi, weights, dim, FEType, deg);
2471 SmallMatrix<SC> B(dim);
2472 SmallMatrix<SC> Binv(dim);
2474 vec_dbl_Type v_i(dim);
2475 vec_dbl_Type v_j(dim);
2478 for (UN T=0; T<elements->numberElements(); T++) {
2480 Helper::buildTransformation(elements->getElement(T).getVectorNodeList(), pointsRep, B, FEType);
2481 detB = B.computeInverse(Binv);
2482 absDetB = std::fabs(detB);
2484 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
2485 applyBTinv( dPhi, dPhiTrans, Binv );
2487 for (UN i=0; i < dPhiTrans[0].size(); i++) {
2488 Teuchos::Array<SC> value( dPhiTrans[0].size(), 0. );
2489 Teuchos::Array<GO> indices( dPhiTrans[0].size(), 0 );
2490 for (UN j=0; j < value.size(); j++) {
2491 for (UN w=0; w<dPhiTrans.size(); w++) {
2492 for (UN d=0; d<dim; d++)
2493 value[j] += weights->at(w) * dPhiTrans[w][i][d] * dPhiTrans[w][j][d];
2495 value[j] *= absDetB;
2496 if (setZeros_ && std::fabs(value[j]) < myeps_) {
2500 for (UN d=0; d<dim; d++) {
2501 for (UN j=0; j < indices.size(); j++)
2502 indices[j] = GO ( dim * map->getGlobalElement( elements->getElement(T).getNode(j) ) + d );
2504 GO row = GO ( dim * map->getGlobalElement( elements->getElement(T).getNode(i) ) + d );
2505 A->insertGlobalValues( row, indices(), value() );
2509 if (callFillComplete)
2513template <
class SC,
class LO,
class GO,
class NO>
2514void FE<SC,LO,GO,NO>::assemblyLaplaceVecFieldV2(
int dim,
2518 bool callFillComplete){
2520 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
2521 UN FEloc = checkFE(dim,FEType);
2523 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
2525 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
2527 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
2529 vec3D_dbl_ptr_Type dPhi;
2530 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
2532 UN deg = 2*Helper::determineDegree(dim,FEType,Helper::Deriv1);
2534 Helper::getDPhi(dPhi, weights, dim, FEType, deg);
2536 Teuchos::BLAS<int, SC> teuchosBLAS;
2538 int nmbQuadPoints = dPhi->size();
2539 int nmbScalarDPhi = dPhi->at(0).size();
2540 int nmbAllDPhi = nmbScalarDPhi * dim;
2541 int nmbAllDPhiAllQaud = nmbQuadPoints * nmbAllDPhi;
2542 int sizeLocStiff = dim*dim;
2543 Teuchos::Array<SmallMatrix<double> > dPhiMat( nmbAllDPhiAllQaud, SmallMatrix<double>(dim) );
2544 this->buildFullDPhi( dPhi, dPhiMat );
2549 SmallMatrix<SC> B(dim);
2550 SmallMatrix<SC> Binv(dim);
2552 vec_dbl_Type v_i(dim);
2553 vec_dbl_Type v_j(dim);
2555 for (UN T=0; T<elements->numberElements(); T++) {
2557 Helper::buildTransformation(elements->getElement(T).getVectorNodeList(), pointsRep, B);
2558 detB = B.computeInverse(Binv);
2559 absDetB = std::fabs(detB);
2561 Teuchos::Array<SmallMatrix<double> > allDPhiMatTrans( dPhiMat.size(), SmallMatrix<double>() );
2563 for (
int i=0; i<allDPhiMatTrans.size(); i++) {
2564 SmallMatrix<double> res = dPhiMat[i] * Binv;
2565 allDPhiMatTrans[i] = res;
2568 SmallMatrix<double> locStiffMat( nmbAllDPhi, 0. );
2570 for (
int p=0; p<nmbQuadPoints; p++){
2572 double* allDPhiBlas =
new double[ nmbAllDPhi * sizeLocStiff ];
2574 int offset = p * nmbAllDPhi;
2575 int offsetInArray = 0;
2576 for (
int i=0; i<nmbAllDPhi; i++) {
2577 fillMatrixArray( allDPhiMatTrans[ offset + i ], allDPhiBlas,
"rows",offsetInArray );
2578 offsetInArray += sizeLocStiff;
2581 double* locStiffMatBlas =
new double[ nmbAllDPhi * nmbAllDPhi ];
2583 teuchosBLAS.GEMM (Teuchos::TRANS, Teuchos::NO_TRANS, nmbAllDPhi, nmbAllDPhi, sizeLocStiff, 1., allDPhiBlas, sizeLocStiff, allDPhiBlas, sizeLocStiff, 0., locStiffMatBlas, nmbAllDPhi);
2585 for (
int i=0; i<nmbAllDPhi; i++) {
2586 for (
int j=0; j<nmbAllDPhi; j++) {
2587 locStiffMat[i][j] += weights->at(p) * locStiffMatBlas[ j * nmbAllDPhi + i ];
2591 delete [] allDPhiBlas;
2592 delete [] locStiffMatBlas;
2596 for (UN i=0; i < nmbScalarDPhi; i++) {
2597 Teuchos::Array<SC> value( nmbAllDPhi, 0. );
2598 Teuchos::Array<GO> indices( nmbAllDPhi, 0 );
2599 for (UN d=0; d<dim; d++) {
2600 for (UN j=0; j < nmbScalarDPhi; j++){
2601 value[ j * dim + d ] = absDetB * locStiffMat[dim * i + d][j];
2602 indices[ j * dim + d ] = GO ( dim * map->getGlobalElement( elements->getElement(T).getNode(j) ) + d );
2604 GO row = GO ( dim * map->getGlobalElement( elements->getElement(T).getNode(i) ) + d );
2605 A->insertGlobalValues( row, indices(), value() );
2609 if (callFillComplete)
2629template <
class SC,
class LO,
class GO,
class NO>
2631 int dim, std::string FEType,
int degree, MultiVectorPtr_Type u_rep,
2632 BlockMatrixPtr_Type &A, BlockMultiVectorPtr_Type &resVec,
2633 ParameterListPtr_Type params, std::string assembleMode,
bool callFillComplete,
2634 int FELocExternal) {
2636 ElementsPtr_Type elements = this->domainVec_.at(0)->getElementsC();
2641 vec2D_dbl_ptr_Type pointsRep = this->domainVec_.at(0)->getPointsRepeated();
2642 MapConstPtr_Type map = this->domainVec_.at(0)->getMapRepeated();
2644 vec_dbl_Type solution_u;
2645 vec_dbl_ptr_Type rhsVec;
2648 if (FEType ==
"P2") {
2653 if (FEType ==
"P2") {
2662 tuple_disk_vec_ptr_Type problemDisk =
2663 Teuchos::rcp(
new tuple_disk_vec_Type(0));
2664 tuple_ssii_Type temp(
"Solution", FEType, dofs, numNodes);
2665 problemDisk->push_back(temp);
2668 if (assemblyFEElements_.size() == 0) {
2669 initAssembleFEElements(
"NonLinearLaplace", problemDisk, elements, params, pointsRep, domainVec_.at(0)->getElementMap());
2670 }
else if (assemblyFEElements_.size() != elements->numberElements()) {
2671 TEUCHOS_TEST_FOR_EXCEPTION(
2672 true, std::logic_error,
2673 "Number Elements not the same as number assembleFE elements.");
2676 MultiVectorPtr_Type resVec_u;
2677 BlockMultiVectorPtr_Type resVecRep;
2679 if (assembleMode !=
"Rhs") {
2683 auto A_block_zero_zero = Teuchos::rcp(
2684 new Matrix_Type(this->domainVec_.at(0)->getMapUnique(), this->domainVec_.at(0)->getApproxEntriesPerRow()));
2686 A->addBlock(A_block_zero_zero, 0, 0);
2689 resVec_u = Teuchos::rcp(
new MultiVector_Type(map, 1));
2690 resVecRep = Teuchos::rcp(
new BlockMultiVector_Type(1));
2691 resVecRep->addBlock(resVec_u, 0);
2694 for (UN T = 0; T < assemblyFEElements_.size(); T++) {
2695 vec_dbl_Type solution(0);
2698 solution_u = getSolution(elements->getElement(T).getVectorNodeList(),
2700 solution.insert(solution.end(), solution_u.begin(), solution_u.end());
2701 assemblyFEElements_[T]->updateSolution(solution);
2703 if (assembleMode ==
"Jacobian") {
2704 SmallMatrixPtr_Type elementMatrix;
2705 assemblyFEElements_[T]->assembleJacobian();
2706 elementMatrix = assemblyFEElements_[T]->getJacobian();
2709 assemblyFEElements_[T]
2710 ->advanceNewtonStep();
2711 addFeBlock(A, elementMatrix, elements->getElement(T), map, 0, 0,
2715 if (assembleMode ==
"Rhs") {
2716 assemblyFEElements_[T]->assembleRHS();
2717 rhsVec = assemblyFEElements_[T]->getRHS();
2722 addFeBlockMv(resVecRep, rhsVec, elements->getElement(T), dofs);
2725 if (callFillComplete && assembleMode !=
"Rhs") {
2728 A->getBlock(0, 0)->fillComplete(domainVec_.at(0)->getMapUnique(),
2729 domainVec_.at(0)->getMapUnique());
2731 if (assembleMode ==
"Rhs") {
2733 MultiVectorPtr_Type resVecUnique = Teuchos::rcp(
2734 new MultiVector_Type(domainVec_.at(0)->getMapUnique(), 1));
2735 resVecUnique->putScalar(0.);
2736 resVecUnique->exportFromVector(resVec_u,
true,
"Add");
2737 resVec->addBlock(resVecUnique, 0);
2742template <
class SC,
class LO,
class GO,
class NO>
2743void FE<SC,LO,GO,NO>::assemblyElasticityJacobianAndStressAceFEM(
int dim,
2746 MultiVectorPtr_Type &f,
2747 MultiVectorPtr_Type u,
2748 ParameterListPtr_Type pList,
2750 bool callFillComplete){
2751 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::runtime_error,
"Not implemented for P0");
2752 UN FEloc = checkFE(dim,FEType);
2755 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
2756 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
2758 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
2759 vec3D_dbl_ptr_Type dPhi;
2760 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
2771 Teuchos::BLAS<int,SC> teuchosBLAS;
2773 int nmbQuadPoints = dPhi->size();
2774 int nmbScalarDPhi = dPhi->at(0).size();
2775 int nmbAllDPhi = nmbScalarDPhi * dim;
2776 int nmbAllDPhiAllQaud = nmbQuadPoints * nmbAllDPhi;
2777 int sizeLocStiff = dim*dim;
2778 Teuchos::Array<SmallMatrix<SC> > dPhiMat( nmbAllDPhiAllQaud,
SmallMatrix<SC>(dim) );
2780 this->buildFullDPhi( dPhi, dPhiMat );
2782 std::string material_model = pList->sublist(
"Parameter").get(
"Material model",
"Neo-Hooke");
2784 double poissonRatio = pList->sublist(
"Parameter").get(
"Poisson Ratio",0.4);
2785 double mue = pList->sublist(
"Parameter").get(
"Mu",2.0e+6);
2786 double mue1 = pList->sublist(
"Parameter").get(
"Mu1",2.0e+6);
2787 double mue2 = pList->sublist(
"Parameter").get(
"Mu2",2.0e+6);
2789 double E = pList->sublist(
"Parameter").get(
"E",3.0e+6);
2790 double E1 = pList->sublist(
"Parameter").get(
"E1",3.0e+6);
2791 double E2 = pList->sublist(
"Parameter").get(
"E2",3.0e+6);
2793 if (material_model==
"Saint Venant-Kirchhoff") {
2794 E = mue*2.*(1. + poissonRatio);
2795 E1 = mue1*2.*(1. + poissonRatio);
2796 E2 = mue2*2.*(1. + poissonRatio);
2800 double lambda = (poissonRatio*E)/((1 + poissonRatio)*(1 - 2*poissonRatio));
2801 double lambda1 = (poissonRatio*E1)/((1 + poissonRatio)*(1 - 2*poissonRatio));
2802 double lambda2 = (poissonRatio*E2)/((1 + poissonRatio)*(1 - 2*poissonRatio));
2806 if(!material_model.compare(
"Saint Venant-Kirchhoff"))
2807 v =
new double[154];
2809 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Only Saint Venant-Kirchhoff in 2D.");
2811 double** Pmat =
new double*[2];
2812 for (
int i=0; i<2; i++)
2813 Pmat[i] =
new double[2];
2815 double** F =
new double*[2];
2816 for (
int i=0; i<2; i++)
2817 F[i] =
new double[2];
2819 double**** Amat =
new double***[2];
2820 for (
int i=0; i<2; i++){
2821 Amat[i] =
new double**[2];
2822 for (
int j=0; j<2; j++) {
2823 Amat[i][j] =
new double*[2];
2824 for (
int k=0; k<2; k++)
2825 Amat[i][j][k] =
new double[2];
2829 Teuchos::ArrayRCP< const SC > uArray = u->getData(0);
2831 Teuchos::ArrayRCP<SC> fValues = f->getDataNonConst(0);
2833 Teuchos::Array<int> indices(2);
2834 for (
int T=0; T<elements->numberElements(); T++) {
2836 Helper::buildTransformation(elements->getElement(T).getVectorNodeList(), pointsRep, B);
2837 detB = B.computeInverse(Binv);
2838 absDetB = std::fabs(detB);
2840 Teuchos::Array<SmallMatrix<SC> > all_dPhiMat_Binv( dPhiMat.size(), SmallMatrix<SC>() );
2842 for (
int i=0; i<all_dPhiMat_Binv.size(); i++) {
2843 SmallMatrix<SC> res = dPhiMat[i] * Binv;
2844 all_dPhiMat_Binv[i] = res;
2847 SmallMatrix<SC> locStiffMat( nmbAllDPhi, 0. );
2848 std::vector<SC> locStresses( nmbAllDPhi, 0. );
2849 int elementFlag = 0;
2850 for (
int p=0; p<nmbQuadPoints; p++){
2852 SmallMatrix<SC> Fmat( dim, 0. );
2853 SmallMatrix<SC> tmpForScaling( dim, 0. );
2854 Fmat[0][0] = 1.; Fmat[1][1] = 1.;
2856 for (
int i=0; i<nmbScalarDPhi; i++) {
2857 indices.at(0) = dim * elements->getElement(T).getNode(i);
2858 indices.at(1) = dim * elements->getElement(T).getNode(i) + 1;
2860 for (
int j=0; j<dim; j++) {
2861 tmpForScaling = all_dPhiMat_Binv[ p * nmbAllDPhi + dim * i + j ];
2862 SC v = uArray[indices.at(j)];
2863 tmpForScaling.scale( v );
2864 Fmat += tmpForScaling;
2868 for (
int i=0; i<Fmat.size(); i++) {
2869 for (
int j=0; j<Fmat.size(); j++) {
2870 F[i][j] = Fmat[i][j];
2874 elementFlag = elements->getElement(T).getFlag();
2875 if (elementFlag == 1){
2880 else if (elementFlag == 2){
2886 if ( !material_model.compare(
"Saint Venant-Kirchhoff") )
2887 stvk2d(v, &lambda, &mue, F, Pmat, Amat);
2889 SmallMatrix<SC> Aloc(dim*dim);
2890 for (
int i=0; i<2; i++) {
2891 for (
int j=0; j<2; j++) {
2892 for (
int k=0; k<2; k++) {
2893 for (
int l=0; l<2; l++) {
2894 Aloc[ 2 * i + j ][ 2 * k + l ] = Amat[i][j][k][l];
2900 double* aceFEMFunc =
new double[ sizeLocStiff * sizeLocStiff ];
2901 double* allDPhiBlas =
new double[ nmbAllDPhi * sizeLocStiff ];
2904 double* resTmp =
new double[ nmbAllDPhi * sizeLocStiff ];
2906 fillMatrixArray(Aloc, aceFEMFunc,
"cols");
2908 int offset = p * nmbAllDPhi;
2909 int offsetInArray = 0;
2910 for (
int i=0; i<nmbAllDPhi; i++) {
2911 fillMatrixArray( all_dPhiMat_Binv[ offset + i ], allDPhiBlas,
"rows",offsetInArray );
2912 offsetInArray += sizeLocStiff;
2915 teuchosBLAS.GEMM (Teuchos::NO_TRANS, Teuchos::NO_TRANS, sizeLocStiff, nmbAllDPhi, sizeLocStiff, 1., aceFEMFunc, sizeLocStiff, allDPhiBlas, sizeLocStiff, 0., resTmp, sizeLocStiff);
2918 double* locStiffMatBlas =
new double[ nmbAllDPhi * nmbAllDPhi ];
2920 teuchosBLAS.GEMM (Teuchos::TRANS, Teuchos::NO_TRANS, nmbAllDPhi, nmbAllDPhi, sizeLocStiff, 1., allDPhiBlas, sizeLocStiff, resTmp, sizeLocStiff, 0., locStiffMatBlas, nmbAllDPhi);
2922 for (
int i=0; i<nmbAllDPhi; i++) {
2923 for (
int j=0; j<nmbAllDPhi; j++)
2924 locStiffMat[i][j] += weights->at(p) * locStiffMatBlas[ j * nmbAllDPhi + i ];
2928 delete [] locStiffMatBlas;
2932 double* fArray =
new double[ sizeLocStiff ];
2933 for (
int i=0; i<dim; i++) {
2934 for (
int j=0; j<dim; j++) {
2935 fArray[i * dim + j] = Pmat[i][j];
2939 double* res =
new double[ nmbAllDPhi ];
2940 teuchosBLAS.GEMV(Teuchos::TRANS, sizeLocStiff, nmbAllDPhi, 1., allDPhiBlas, sizeLocStiff, fArray, 1, 0., res, 1);
2941 for (
int i=0; i<locStresses.size(); i++) {
2942 locStresses[i] += weights->at(p) * res[i];
2946 delete [] aceFEMFunc;
2947 delete [] allDPhiBlas;
2951 for (
int i=0; i<nmbScalarDPhi; i++) {
2952 for (
int d1=0; d1<dim; d1++) {
2954 LO rowLO = dim * elements->getElement(T).getNode(i) + d1;
2955 SC v = absDetB * locStresses[ dim * i + d1 ];
2956 fValues[rowLO] += v;
2958 Teuchos::Array<SC> value( nmbAllDPhi, 0. );
2959 Teuchos::Array<GO> indices( nmbAllDPhi, 0 );
2961 for (UN j=0; j < nmbScalarDPhi; j++){
2962 for (UN d2=0; d2<dim; d2++) {
2963 indices[counter] = GO ( dim * map->getGlobalElement( elements->getElement(T).getNode(j) ) + d2 );
2964 value[counter] = absDetB * locStiffMat[dim*i+d1][dim*j+d2];
2968 GO row = GO ( dim * map->getGlobalElement( elements->getElement(T).getNode(i) ) + d1 );
2969 A->insertGlobalValues( row, indices(), value() );
2975 for (
int i=0; i<2; i++)
2978 for (
int i=0; i<2; i++)
2982 for (
int i=0; i<2; i++){
2983 for (
int j=0; j<2; j++) {
2984 for (
int k=0; k<2; k++)
2985 delete [] Amat[i][j][k];
2986 delete [] Amat[i][j];
2994 else if (dim == 3) {
2996 if (!material_model.compare(
"Neo-Hooke"))
2997 v =
new double[466];
2998 else if(!material_model.compare(
"Mooney-Rivlin"))
2999 v =
new double[476];
3000 else if(!material_model.compare(
"Saint Venant-Kirchhoff"))
3001 v =
new double[279];
3003 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Only Neo-Hooke, Mooney-Rivlin and Saint Venant-Kirchhoff.");
3006 double** Pmat =
new double*[3];
3007 for (
int i=0; i<3; i++)
3008 Pmat[i] =
new double[3];
3010 double** F =
new double*[3];
3011 for (
int i=0; i<3; i++)
3012 F[i] =
new double[3];
3014 double**** Amat =
new double***[3];
3015 for (
int i=0; i<3; i++){
3016 Amat[i] =
new double**[3];
3017 for (
int j=0; j<3; j++) {
3018 Amat[i][j] =
new double*[3];
3019 for (
int k=0; k<3; k++)
3020 Amat[i][j][k] =
new double[3];
3024 Teuchos::ArrayRCP< const SC > uArray = u->getData(0);
3026 Teuchos::ArrayRCP<SC> fValues = f->getDataNonConst(0);
3028 Teuchos::Array<int> indices(3);
3029 for (
int T=0; T<elements->numberElements(); T++) {
3031 Helper::buildTransformation(elements->getElement(T).getVectorNodeList(), pointsRep, B);
3032 detB = B.computeInverse(Binv);
3033 absDetB = std::fabs(detB);
3035 Teuchos::Array<SmallMatrix<SC> > all_dPhiMat_Binv( dPhiMat.size(), SmallMatrix<SC>() );
3037 for (
int i=0; i<all_dPhiMat_Binv.size(); i++) {
3038 SmallMatrix<SC> res = dPhiMat[i] * Binv;
3039 all_dPhiMat_Binv[i] = res;
3042 SmallMatrix<SC> locStiffMat( nmbAllDPhi, 0. );
3043 std::vector<SC> locStresses( nmbAllDPhi, 0. );
3044 int elementFlag = 0;
3045 for (
int p=0; p<nmbQuadPoints; p++){
3047 SmallMatrix<SC> Fmat( dim, 0. );
3048 SmallMatrix<SC> tmpForScaling( dim, 0. );
3049 Fmat[0][0] = 1.; Fmat[1][1] = 1.; Fmat[2][2] = 1.;
3051 for (
int i=0; i<nmbScalarDPhi; i++) {
3052 indices.at(0) = dim * elements->getElement(T).getNode(i);
3053 indices.at(1) = dim * elements->getElement(T).getNode(i) + 1;
3054 indices.at(2) = dim * elements->getElement(T).getNode(i) + 2;
3056 for (
int j=0; j<dim; j++) {
3057 tmpForScaling = all_dPhiMat_Binv[ p * nmbAllDPhi + dim * i + j ];
3058 SC v = uArray[indices.at(j)];
3059 tmpForScaling.scale( v );
3060 Fmat += tmpForScaling;
3064 for (
int i=0; i<Fmat.size(); i++) {
3065 for (
int j=0; j<Fmat.size(); j++) {
3066 F[i][j] = Fmat[i][j];
3070 elementFlag = elements->getElement(T).getFlag();
3071 if (elementFlag == 1){
3076 else if (elementFlag == 2){
3082 if ( !material_model.compare(
"Neo-Hooke") )
3083 nh3d(v, &E, &poissonRatio, F, Pmat, Amat);
3084 else if ( !material_model.compare(
"Mooney-Rivlin") )
3085 mr3d(v, &E, &poissonRatio, &C, F, Pmat, Amat);
3086 else if ( !material_model.compare(
"Saint Venant-Kirchhoff") )
3087 stvk3d(v, &lambda, &mue, F, Pmat, Amat);
3089 SmallMatrix<SC> Aloc(dim*dim);
3090 for (
int i=0; i<3; i++) {
3091 for (
int j=0; j<3; j++) {
3092 for (
int k=0; k<3; k++) {
3093 for (
int l=0; l<3; l++) {
3094 Aloc[ 3 * i + j ][ 3 * k + l ] = Amat[i][j][k][l];
3100 double* aceFEMFunc =
new double[ sizeLocStiff * sizeLocStiff ];
3101 double* allDPhiBlas =
new double[ nmbAllDPhi * sizeLocStiff ];
3104 double* resTmp =
new double[ nmbAllDPhi * sizeLocStiff ];
3106 fillMatrixArray(Aloc, aceFEMFunc,
"cols");
3108 int offset = p * nmbAllDPhi;
3109 int offsetInArray = 0;
3110 for (
int i=0; i<nmbAllDPhi; i++) {
3111 fillMatrixArray( all_dPhiMat_Binv[ offset + i ], allDPhiBlas,
"rows",offsetInArray );
3112 offsetInArray += sizeLocStiff;
3115 teuchosBLAS.GEMM (Teuchos::NO_TRANS, Teuchos::NO_TRANS, sizeLocStiff, nmbAllDPhi, sizeLocStiff, 1., aceFEMFunc, sizeLocStiff, allDPhiBlas, sizeLocStiff, 0., resTmp, sizeLocStiff);
3118 double* locStiffMatBlas =
new double[ nmbAllDPhi * nmbAllDPhi ];
3120 teuchosBLAS.GEMM (Teuchos::TRANS, Teuchos::NO_TRANS, nmbAllDPhi, nmbAllDPhi, sizeLocStiff, 1., allDPhiBlas, sizeLocStiff, resTmp, sizeLocStiff, 0., locStiffMatBlas, nmbAllDPhi);
3122 for (
int i=0; i<nmbAllDPhi; i++) {
3123 for (
int j=0; j<nmbAllDPhi; j++)
3124 locStiffMat[i][j] += weights->at(p) * locStiffMatBlas[ j * nmbAllDPhi + i ];
3128 delete [] locStiffMatBlas;
3132 double* fArray =
new double[ sizeLocStiff ];
3133 for (
int i=0; i<dim; i++) {
3134 for (
int j=0; j<dim; j++) {
3135 fArray[i * dim + j] = Pmat[i][j];
3139 double* res =
new double[ nmbAllDPhi ];
3140 teuchosBLAS.GEMV(Teuchos::TRANS, sizeLocStiff, nmbAllDPhi, 1., allDPhiBlas, sizeLocStiff, fArray, 1, 0., res, 1);
3141 for (
int i=0; i<locStresses.size(); i++) {
3142 locStresses[i] += weights->at(p) * res[i];
3146 delete [] aceFEMFunc;
3147 delete [] allDPhiBlas;
3151 for (
int i=0; i<nmbScalarDPhi; i++) {
3152 for (
int d1=0; d1<dim; d1++) {
3154 LO rowLO = dim * elements->getElement(T).getNode(i) + d1;
3155 SC v = absDetB * locStresses[ dim * i + d1 ];
3156 fValues[rowLO] += v;
3158 Teuchos::Array<SC> value( nmbAllDPhi, 0. );
3159 Teuchos::Array<GO> indices( nmbAllDPhi, 0 );
3161 for (UN j=0; j < nmbScalarDPhi; j++){
3162 for (UN d2=0; d2<dim; d2++) {
3163 indices[counter] = GO ( dim * map->getGlobalElement( elements->getElement(T).getNode(j) ) + d2 );
3164 value[counter] = absDetB * locStiffMat[dim*i+d1][dim*j+d2];
3169 GO row = GO ( dim * map->getGlobalElement( elements->getElement(T).getNode(i) ) + d1 );
3170 A->insertGlobalValues( row, indices(), value() );
3176 for (
int i=0; i<3; i++)
3179 for (
int i=0; i<3; i++)
3183 for (
int i=0; i<3; i++){
3184 for (
int j=0; j<3; j++) {
3185 for (
int k=0; k<3; k++)
3186 delete [] Amat[i][j][k];
3187 delete [] Amat[i][j];
3194 if (callFillComplete)
3200template <
class SC,
class LO,
class GO,
class NO>
3201void FE<SC,LO,GO,NO>::assemblyElasticityJacobianAceFEM(
int dim,
3204 MultiVectorPtr_Type u,
3205 std::string material_model,
3209 bool callFillComplete){
3210 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
3211 UN FEloc = checkFE(dim,FEType);
3213 vec2D_int_ptr_Type elements = domainVec_.at(FEloc)->getElements();
3215 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
3217 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
3218 vec3D_dbl_ptr_Type dPhi;
3219 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
3221 UN deg = 2*Helper::determineDegree(dim,FEType,Helper::Deriv1);
3223 Helper::getDPhi(dPhi, weights, dim, FEType, deg);
3227 SmallMatrix<SC> B(dim);
3228 SmallMatrix<SC> Binv(dim);
3230 Teuchos::BLAS<int, SC> teuchosBLAS;
3232 int nmbQuadPoints = dPhi->size();
3233 int nmbScalarDPhi = dPhi->at(0).size();
3234 int nmbAllDPhi = nmbScalarDPhi * dim;
3235 int nmbAllDPhiAllQaud = nmbQuadPoints * nmbAllDPhi;
3236 int sizeLocStiff = dim*dim;
3237 Teuchos::Array<SmallMatrix<SC> > dPhiMat( nmbAllDPhiAllQaud, SmallMatrix<SC>(dim) );
3239 this->buildFullDPhi( dPhi, dPhiMat );
3242 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Only for 3D.");
3244 else if (dim == 3) {
3247 if (!material_model.compare(
"Neo-Hooke"))
3248 v =
new double[466];
3249 else if(!material_model.compare(
"Mooney-Rivlin"))
3250 v =
new double[476];
3252 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Only Neo-Hooke and Mooney-Rivlin.");
3256 double** Pmat =
new double*[3];
3257 for (
int i=0; i<3; i++)
3258 Pmat[i] =
new double[3];
3260 double** F =
new double*[3];
3261 for (
int i=0; i<3; i++)
3262 F[i] =
new double[3];
3264 double**** Amat =
new double***[3];
3265 for (
int i=0; i<3; i++){
3266 Amat[i] =
new double**[3];
3267 for (
int j=0; j<3; j++) {
3268 Amat[i][j] =
new double*[3];
3269 for (
int k=0; k<3; k++)
3270 Amat[i][j][k] =
new double[3];
3274 Teuchos::ArrayRCP< const SC > uArray = u->getData(0);
3276 Teuchos::Array<int> indices(3);
3277 for (
int T=0; T<elements->size(); T++) {
3279 Helper::buildTransformation(elements->at(T), pointsRep, B);
3280 detB = B.computeInverse(Binv);
3281 absDetB = std::fabs(detB);
3283 Teuchos::Array<SmallMatrix<SC> > all_dPhiMat_Binv( dPhiMat.size(), SmallMatrix<SC>() );
3285 for (
int i=0; i<all_dPhiMat_Binv.size(); i++) {
3286 SmallMatrix<SC> res = dPhiMat[i] * Binv;
3287 all_dPhiMat_Binv[i] = res;
3290 SmallMatrix<SC> locStiffMat( nmbAllDPhi, 0. );
3292 for (
int p=0; p<nmbQuadPoints; p++){
3294 SmallMatrix<SC> Fmat( dim, 0. );
3295 SmallMatrix<SC> tmpForScaling( dim, 0. );
3296 Fmat[0][0] = 1.; Fmat[1][1] = 1.; Fmat[2][2] = 1.;
3298 for (
int i=0; i<nmbScalarDPhi; i++) {
3299 indices.at(0) = dim * elements->at(T).at(i);
3300 indices.at(1) = dim * elements->at(T).at(i) + 1;
3301 indices.at(2) = dim * elements->at(T).at(i) + 2;
3303 for (
int j=0; j<dim; j++) {
3304 tmpForScaling = all_dPhiMat_Binv[ p * nmbAllDPhi + dim * i + j ];
3305 SC v = uArray[indices.at(j)];
3306 tmpForScaling.scale( v );
3307 Fmat += tmpForScaling;
3311 for (
int i=0; i<Fmat.size(); i++) {
3312 for (
int j=0; j<Fmat.size(); j++) {
3313 F[i][j] = Fmat[i][j];
3316 if ( !material_model.compare(
"Neo-Hooke") )
3317 nh3d(v, &E, &nu, F, Pmat, Amat);
3318 else if ( !material_model.compare(
"Mooney-Rivlin") )
3319 mr3d(v, &E, &nu, &C, F, Pmat, Amat);
3321 SmallMatrix<SC> Aloc(dim*dim);
3322 for (
int i=0; i<3; i++) {
3323 for (
int j=0; j<3; j++) {
3324 for (
int k=0; k<3; k++) {
3325 for (
int l=0; l<3; l++) {
3326 Aloc[ 3 * i + j ][ 3 * k + l ] = Amat[i][j][k][l];
3332 double* aceFEMFunc =
new double[ sizeLocStiff * sizeLocStiff ];
3333 double* allDPhiBlas =
new double[ nmbAllDPhi * sizeLocStiff ];
3334 double* resTmp =
new double[ nmbAllDPhi * sizeLocStiff ];
3336 fillMatrixArray(Aloc, aceFEMFunc,
"cols");
3338 int offset = p * nmbAllDPhi;
3339 int offsetInArray = 0;
3340 for (
int i=0; i<nmbAllDPhi; i++) {
3341 fillMatrixArray( all_dPhiMat_Binv[ offset + i ], allDPhiBlas,
"rows",offsetInArray );
3342 offsetInArray += sizeLocStiff;
3345 teuchosBLAS.GEMM (Teuchos::NO_TRANS, Teuchos::NO_TRANS, sizeLocStiff, nmbAllDPhi, sizeLocStiff, 1., aceFEMFunc, sizeLocStiff, allDPhiBlas, sizeLocStiff, 0., resTmp, sizeLocStiff);
3347 double* locStiffMatBlas =
new double[ nmbAllDPhi * nmbAllDPhi ];
3349 teuchosBLAS.GEMM (Teuchos::TRANS, Teuchos::NO_TRANS, nmbAllDPhi, nmbAllDPhi, sizeLocStiff, 1., allDPhiBlas, sizeLocStiff, resTmp, sizeLocStiff, 0., locStiffMatBlas, nmbAllDPhi);
3351 for (
int i=0; i<nmbAllDPhi; i++) {
3352 for (
int j=0; j<nmbAllDPhi; j++)
3353 locStiffMat[i][j] += weights->at(p) * locStiffMatBlas[ j * nmbAllDPhi + i ];
3356 delete [] aceFEMFunc;
3357 delete [] allDPhiBlas;
3359 delete [] locStiffMatBlas;
3362 for (
int i=0; i<nmbScalarDPhi; i++) {
3363 for (
int d1=0; d1<dim; d1++) {
3364 Teuchos::Array<SC> value( nmbAllDPhi, 0. );
3365 Teuchos::Array<GO> indices( nmbAllDPhi, 0 );
3367 for (UN j=0; j < nmbScalarDPhi; j++){
3368 for (UN d2=0; d2<dim; d2++) {
3369 indices[counter] = GO ( dim * map->getGlobalElement( elements->at(T).at(j) ) + d2 );
3370 value[counter] = absDetB * locStiffMat[dim*i+d1][dim*j+d2];
3374 GO row = GO ( dim * map->getGlobalElement( elements->at(T).at(i) ) + d1 );
3375 A->insertGlobalValues( row, indices(), value() );
3381 for (
int i=0; i<3; i++)
3384 for (
int i=0; i<3; i++)
3388 for (
int i=0; i<3; i++){
3389 for (
int j=0; j<3; j++) {
3390 for (
int k=0; k<3; k++)
3391 delete [] Amat[i][j][k];
3392 delete [] Amat[i][j];
3399 if (callFillComplete)
3404template <
class SC,
class LO,
class GO,
class NO>
3405void FE<SC,LO,GO,NO>::assemblyElasticityStressesAceFEM(
int dim,
3407 MultiVectorPtr_Type &f,
3408 MultiVectorPtr_Type u,
3409 std::string material_model,
3413 bool callFillComplete){
3414 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
3415 UN FEloc = checkFE(dim,FEType);
3417 vec2D_int_ptr_Type elements = domainVec_.at(FEloc)->getElements();
3419 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
3421 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
3423 vec3D_dbl_ptr_Type dPhi;
3424 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
3426 UN deg = 2*Helper::determineDegree(dim,FEType,Helper::Deriv1);
3428 Helper::getDPhi(dPhi, weights, dim, FEType, deg);
3432 SmallMatrix<SC> B(dim);
3433 SmallMatrix<SC> Binv(dim);
3435 Teuchos::BLAS<int, SC> teuchosBLAS;
3437 int nmbQuadPoints = dPhi->size();
3438 int nmbScalarDPhi = dPhi->at(0).size();
3439 int nmbAllDPhi = nmbScalarDPhi * dim;
3440 int nmbAllDPhiAllQaud = nmbQuadPoints * nmbAllDPhi;
3441 int sizeLocStiff = dim*dim;
3442 Teuchos::Array<SmallMatrix<SC> > dPhiMat( nmbAllDPhiAllQaud, SmallMatrix<SC>(dim) );
3444 this->buildFullDPhi( dPhi, dPhiMat );
3447 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Only for 3D.");
3449 else if (dim == 3) {
3452 if (!material_model.compare(
"Neo-Hooke"))
3453 v =
new double[466];
3454 else if(!material_model.compare(
"Mooney-Rivlin"))
3455 v =
new double[476];
3457 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Only Neo-Hooke and Mooney-Rivlin.");
3461 double** Pmat =
new double*[3];
3462 for (
int i=0; i<3; i++)
3463 Pmat[i] =
new double[3];
3465 double** F =
new double*[3];
3466 for (
int i=0; i<3; i++)
3467 F[i] =
new double[3];
3469 double**** Amat =
new double***[3];
3470 for (
int i=0; i<3; i++){
3471 Amat[i] =
new double**[3];
3472 for (
int j=0; j<3; j++) {
3473 Amat[i][j] =
new double*[3];
3474 for (
int k=0; k<3; k++)
3475 Amat[i][j][k] =
new double[3];
3479 Teuchos::ArrayRCP< const SC > uArray = u->getData(0);
3481 Teuchos::ArrayRCP<SC> fValues = f->getDataNonConst(0);
3483 Teuchos::Array<int> indices(3);
3484 for (
int T=0; T<elements->size(); T++) {
3486 Helper::buildTransformation(elements->at(T), pointsRep, B);
3487 detB = B.computeInverse(Binv);
3488 absDetB = std::fabs(detB);
3490 Teuchos::Array<SmallMatrix<SC> > all_dPhiMat_Binv( dPhiMat.size(), SmallMatrix<SC>() );
3492 for (
int i=0; i<all_dPhiMat_Binv.size(); i++) {
3493 SmallMatrix<SC> res = dPhiMat[i] * Binv;
3494 all_dPhiMat_Binv[i] = res;
3496 std::vector<double> locStresses( nmbAllDPhi, 0. );
3498 for (
int p=0; p<nmbQuadPoints; p++){
3500 SmallMatrix<SC> Fmat( dim, 0. );
3501 SmallMatrix<SC> tmpForScaling( dim, 0. );
3502 Fmat[0][0] = 1.; Fmat[1][1] = 1.; Fmat[2][2] = 1.;
3504 for (
int i=0; i<nmbScalarDPhi; i++) {
3505 indices.at(0) = dim * elements->at(T).at(i);
3506 indices.at(1) = dim * elements->at(T).at(i) + 1;
3507 indices.at(2) = dim * elements->at(T).at(i) + 2;
3509 for (
int j=0; j<dim; j++) {
3510 tmpForScaling = all_dPhiMat_Binv[ p * nmbAllDPhi + dim * i + j ];
3511 SC v = uArray[indices.at(j)];
3512 tmpForScaling.scale( v );
3513 Fmat += tmpForScaling;
3517 for (
int i=0; i<Fmat.size(); i++) {
3518 for (
int j=0; j<Fmat.size(); j++) {
3519 F[i][j] = Fmat[i][j];
3522 if ( !material_model.compare(
"Neo-Hooke") )
3523 nh3d(v, &E, &nu, F, Pmat, Amat);
3524 else if ( !material_model.compare(
"Mooney-Rivlin") )
3525 mr3d(v, &E, &nu, &C, F, Pmat, Amat);
3527 double* aceFEMFunc =
new double[ sizeLocStiff * sizeLocStiff ];
3528 double* allDPhiBlas =
new double[ nmbAllDPhi * sizeLocStiff ];
3530 int offset = p * nmbAllDPhi;
3531 int offsetInArray = 0;
3532 for (
int i=0; i<nmbAllDPhi; i++) {
3533 fillMatrixArray( all_dPhiMat_Binv[ offset + i ], allDPhiBlas,
"rows",offsetInArray );
3534 offsetInArray += sizeLocStiff;
3538 double* fArray =
new double[ sizeLocStiff ];
3539 for (
int i=0; i<dim; i++) {
3540 for (
int j=0; j<dim; j++) {
3541 fArray[i * dim + j] = Pmat[i][j];
3545 double* res =
new double[ nmbAllDPhi ];
3546 teuchosBLAS.GEMV(Teuchos::TRANS, sizeLocStiff, nmbAllDPhi, 1., allDPhiBlas, sizeLocStiff, fArray, 1, 0., res, 1);
3547 for (
int i=0; i<locStresses.size(); i++) {
3548 locStresses[i] += weights->at(p) * res[i];
3551 delete [] aceFEMFunc;
3552 delete [] allDPhiBlas;
3558 for (
int i=0; i<nmbScalarDPhi; i++) {
3559 for (
int d1=0; d1<dim; d1++) {
3560 LO row = dim * elements->at(T).at(i) + d1;
3561 SC v = absDetB * locStresses[ dim * i + d1 ];
3569 for (
int i=0; i<3; i++)
3572 for (
int i=0; i<3; i++)
3576 for (
int i=0; i<3; i++){
3577 for (
int j=0; j<3; j++) {
3578 for (
int k=0; k<3; k++)
3579 delete [] Amat[i][j][k];
3580 delete [] Amat[i][j];
3590template <
class SC,
class LO,
class GO,
class NO>
3594 MultiVectorPtr_Type u,
3595 bool callFillComplete){
3597 TEUCHOS_TEST_FOR_EXCEPTION( u->getNumVectors()>1, std::logic_error,
"Implement for numberMV > 1 ." );
3598 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
3600 UN FEloc = checkFE(dim,FEType);
3602 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
3604 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
3606 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
3608 vec3D_dbl_ptr_Type dPhi;
3609 vec2D_dbl_ptr_Type phi;
3610 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
3625 vec_dbl_Type v_i(dim);
3626 vec_dbl_Type v_j(dim);
3628 vec2D_dbl_Type uLoc( dim, vec_dbl_Type( weights->size() , -1. ) );
3629 Teuchos::ArrayRCP< const SC > uArray = u->getData(0);
3631 for (UN T=0; T<elements->numberElements(); T++) {
3634 detB = B.computeInverse(Binv);
3635 absDetB = std::fabs(detB);
3637 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
3638 applyBTinv( dPhi, dPhiTrans, Binv );
3640 for (
int w=0; w<phi->size(); w++){
3641 for (
int d=0; d<dim; d++) {
3643 for (
int i=0; i < phi->at(0).size(); i++) {
3644 LO index = dim * elements->getElement(T).getNode(i) + d;
3645 uLoc[d][w] += uArray[index] * phi->at(w).at(i);
3650 for (UN i=0; i < phi->at(0).size(); i++) {
3651 Teuchos::Array<SC> value( dPhiTrans[0].size(), 0. );
3652 Teuchos::Array<GO> indices( dPhiTrans[0].size(), 0 );
3653 for (UN j=0; j < value.size(); j++) {
3654 for (UN w=0; w<dPhiTrans.size(); w++) {
3655 for (UN d=0; d<dim; d++){
3656 value[j] += weights->at(w) * uLoc[d][w] * (*phi)[w][i] * dPhiTrans[w][j][d];
3660 value[j] *= absDetB;
3661 if (setZeros_ && std::fabs(value[j]) < myeps_) {
3665 GO row = GO ( dim * map->getGlobalElement( elements->getElement(T).getNode(i) ) );
3666 GO glob_j = GO ( dim * map->getGlobalElement( elements->getElement(T).getNode(j) ) );
3668 for (UN d=0; d<dim; d++) {
3669 for (UN j=0; j < indices.size(); j++)
3670 indices[j] = GO ( dim * map->getGlobalElement( elements->getElement(T).getNode(j) ) + d );
3672 GO row = GO ( dim * map->getGlobalElement( elements->getElement(T).getNode(i) ) + d );
3673 A->insertGlobalValues( row, indices(), value() );
3679 if (callFillComplete)
3684template <
class SC,
class LO,
class GO,
class NO>
3688 MultiVectorPtr_Type u,
3689 bool callFillComplete){
3691 TEUCHOS_TEST_FOR_EXCEPTION( u->getNumVectors()>1, std::logic_error,
"Implement for numberMV > 1 ." );
3692 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
3693 UN FEloc = checkFE(dim,FEType);
3695 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
3697 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
3699 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
3701 vec3D_dbl_ptr_Type dPhi;
3702 vec2D_dbl_ptr_Type phi;
3703 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
3717 vec_dbl_Type v_i(dim);
3718 vec_dbl_Type v_j(dim);
3720 Teuchos::ArrayRCP< const SC > uArray = u->getData(0);
3722 for (UN T=0; T<elements->numberElements(); T++) {
3725 detB = B.computeInverse(Binv);
3726 absDetB = std::fabs(detB);
3728 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
3729 applyBTinv( dPhi, dPhiTrans, Binv );
3731 std::vector<SmallMatrix<SC> > duLoc( weights->size(),
SmallMatrix<SC>(dim) );
3733 for (
int w=0; w<dPhiTrans.size(); w++){
3734 for (
int d1=0; d1<dim; d1++) {
3735 for (
int i=0; i < dPhiTrans[0].size(); i++) {
3736 LO index = dim * elements->getElement(T).getNode(i) + d1;
3737 for (
int d2=0; d2<dim; d2++)
3738 duLoc[w][d2][d1] += uArray[index] * dPhiTrans[w][i][d2];
3743 for (UN i=0; i < phi->at(0).size(); i++) {
3744 for (UN d1=0; d1<dim; d1++) {
3745 Teuchos::Array<SC> value( dim*phi->at(0).size(), 0. );
3746 Teuchos::Array<GO> indices( dim*phi->at(0).size(), 0 );
3747 for (UN j=0; j < phi->at(0).size(); j++) {
3748 for (UN d2=0; d2<dim; d2++){
3749 for (UN w=0; w<phi->size(); w++) {
3750 value[ dim * j + d2 ] += weights->at(w) * duLoc[w][d2][d1] * (*phi)[w][i] * (*phi)[w][j];
3752 value[ dim * j + d2 ] *= absDetB;
3754 if (setZeros_ && std::fabs(value[ dim * j + d2 ]) < myeps_) {
3755 value[ dim * j + d2 ] = 0.;
3759 for (UN j=0; j < phi->at(0).size(); j++){
3760 for (UN d2=0; d2<dim; d2++){
3761 indices[ dim * j + d2 ] = GO ( dim * map->getGlobalElement( elements->getElement(T).getNode(j) ) + d2 );
3765 GO row = GO ( dim * map->getGlobalElement( elements->getElement(T).getNode(i) ) + d1 );
3766 A->insertGlobalValues( row, indices(), value() );
3770 if (callFillComplete)
3775template <
class SC,
class LO,
class GO,
class NO>
3777 std::string FEType1,
3778 std::string FEType2,
3780 MatrixPtr_Type &Bmat,
3781 MatrixPtr_Type &BTmat,
3782 MapConstPtr_Type map1,
3783 MapConstPtr_Type map2,
3784 bool callFillComplete) {
3787 UN FEloc1 = checkFE(dim,FEType1);
3788 UN FEloc2 = checkFE(dim,FEType2);
3790 ElementsPtr_Type elements1 = domainVec_.at(FEloc1)->getElementsC();
3791 ElementsPtr_Type elements2 = domainVec_.at(FEloc2)->getElementsC();
3793 vec2D_dbl_ptr_Type pointsRep1 = domainVec_.at(FEloc1)->getPointsRepeated();
3795 MapConstPtr_Type mapping1 = domainVec_.at(FEloc1)->getMapRepeated();
3796 MapConstPtr_Type mapping2;
3798 if (FEType2 ==
"P0")
3799 mapping2 = domainVec_.at(FEloc2)->getElementMap();
3801 mapping2 = domainVec_.at(FEloc2)->getMapRepeated();
3803 vec3D_dbl_ptr_Type dPhi;
3804 vec2D_dbl_ptr_Type phi;
3805 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
3812 if (FEType2==
"P1-disc-global")
3813 Helper::getPhiGlobal(phi, weights, dim, FEType2, deg);
3814 if (FEType2==
"P1-disc" && FEType1==
"Q2" )
3824 vec_dbl_Type v_i(dim);
3825 vec_dbl_Type v_j(dim);
3827 for (UN T=0; T<elements1->numberElements(); T++) {
3830 detB = B.computeInverse(Binv);
3831 absDetB = std::fabs(detB);
3833 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
3834 applyBTinv( dPhi, dPhiTrans, Binv );
3836 for (UN i=0; i < phi->at(0).size(); i++) {
3837 Teuchos::Array<Teuchos::Array<SC> >valueVec( dim, Teuchos::Array<SC>( dPhiTrans[0].size(), 0. ) );
3838 Teuchos::Array<GO> indices( dPhiTrans[0].size(), 0 );
3840 for (UN j=0; j < valueVec[0].size(); j++) {
3841 for (UN w=0; w<dPhiTrans.size(); w++) {
3842 for (UN d=0; d<dim; d++)
3843 valueVec[d][j] += weights->at(w) * phi->at(w)[i] * dPhiTrans[w][j][d];
3845 for (UN d=0; d<dim; d++){
3846 valueVec[d][j] *= absDetB;
3847 if (setZeros_ && std::fabs(valueVec[d][j]) < myeps_) {
3848 valueVec[d][j] = 0.;
3852 for (UN d=0; d<dim; d++) {
3853 for (UN j=0; j < indices.size(); j++)
3854 indices[j] = GO ( dim * mapping1->getGlobalElement( elements1->getElement(T).getNode(j) ) + d );
3858 row = GO ( mapping2->getGlobalElement( T ) );
3860 row = GO ( mapping2->getGlobalElement( elements2->getElement(T).getNode(i) ) );
3861 Bmat->insertGlobalValues( row, indices(), valueVec[d]() );
3866 for (UN i=0; i < dPhiTrans[0].size(); i++) {
3868 Teuchos::Array<Teuchos::Array<SC> >valueVec( dim, Teuchos::Array<SC>( phi->at(0).size(), 0. ) );
3869 Teuchos::Array<GO> indices( phi->at(0).size(), 0 );
3870 for (UN j=0; j < valueVec[0].size(); j++) {
3871 for (UN w=0; w<dPhiTrans.size(); w++) {
3872 for (UN d=0; d<dim; d++)
3873 valueVec[d][j] += weights->at(w) * phi->at(w)[j] * dPhiTrans[w][i][d];
3875 for (UN d=0; d<dim; d++){
3876 valueVec[d][j] *= absDetB;
3877 if (setZeros_ && std::fabs(valueVec[d][j]) < myeps_) {
3878 valueVec[d][j] = 0.;
3883 for (UN j=0; j < indices.size(); j++){
3885 indices[j] = GO ( mapping2->getGlobalElement( T ) );
3887 indices[j] = GO ( mapping2->getGlobalElement( elements2->getElement(T).getNode(j) ) );
3889 for (UN d=0; d<dim; d++) {
3890 GO row = GO ( dim * mapping1->getGlobalElement( elements1->getElement(T).getNode(i) ) + d );
3891 BTmat->insertGlobalValues( row, indices(), valueVec[d]() );
3897 if (callFillComplete) {
3898 Bmat->fillComplete( map1, map2 );
3899 BTmat->fillComplete( map2, map1 );
3905template <
class SC,
class LO,
class GO,
class NO>
3907 std::string FEType1,
3908 std::string FEType2,
3910 MatrixPtr_Type &Bmat,
3911 MatrixPtr_Type &BTmat,
3912 MapConstPtr_Type map1,
3913 MapConstPtr_Type map2,
3914 bool callFillComplete) {
3917 UN FEloc1 = checkFE(dim,FEType1);
3918 UN FEloc2 = checkFE(dim,FEType2);
3920 ElementsPtr_Type elements1 = domainVec_.at(FEloc1)->getElementsC();
3921 ElementsPtr_Type elements2 = domainVec_.at(FEloc2)->getElementsC();
3923 vec2D_dbl_ptr_Type pointsRep1 = domainVec_.at(FEloc1)->getPointsRepeated();
3925 MapConstPtr_Type mapping1 = domainVec_.at(FEloc1)->getMapRepeated();
3926 MapConstPtr_Type mapping2;
3928 if (FEType2 ==
"P0")
3929 mapping2 = domainVec_.at(FEloc2)->getElementMap();
3931 mapping2 = domainVec_.at(FEloc2)->getMapRepeated();
3933 vec3D_dbl_ptr_Type dPhi;
3934 vec2D_dbl_ptr_Type phi;
3935 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
3942 if (FEType2==
"P1-disc-global")
3943 Helper::getPhiGlobal(phi, weights, dim, FEType2, deg);
3944 if (FEType2==
"P1-disc" && FEType1==
"Q2" )
3954 vec_dbl_Type v_i(dim);
3955 vec_dbl_Type v_j(dim);
3957 Teuchos::Array<GO> colIndex( 1, 0 );
3958 Teuchos::Array<GO> rowIndex( 1, 0 );
3959 Teuchos::Array<SC> value(1, 0.);
3961 for (UN T=0; T<elements1->numberElements(); T++) {
3964 detB = B.computeInverse(Binv);
3965 absDetB = std::fabs(detB);
3967 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
3968 applyBTinv( dPhi, dPhiTrans, Binv );
3970 for (UN i=0; i < phi->at(0).size(); i++) {
3972 rowIndex[0] = GO ( mapping2->getGlobalElement( T ) );
3974 rowIndex[0] = GO ( mapping2->getGlobalElement( elements2->getElement(T).getNode(i) ) );
3976 for (UN j=0; j < dPhiTrans[0].size(); j++) {
3977 for (UN d=0; d<dim; d++){
3979 for (UN w=0; w<dPhiTrans.size(); w++)
3980 value[0] += weights->at(w) * phi->at(w)[i] * dPhiTrans[w][j][d];
3981 value[0] *= absDetB;
3982 colIndex[0] = GO ( dim * mapping1->getGlobalElement( elements1->getElement(T).getNode(j) ) + d );
3983 Bmat->insertGlobalValues( rowIndex[0], colIndex(), value() );
3984 BTmat->insertGlobalValues( colIndex[0], rowIndex(), value() );
3991 if (callFillComplete) {
3992 Bmat->fillComplete( map1, map2 );
3993 BTmat->fillComplete( map2, map1 );
3998template <
class SC,
class LO,
class GO,
class NO>
4002 bool callFillComplete){
4004 TEUCHOS_TEST_FOR_EXCEPTION(FEType !=
"P1",std::logic_error,
"Only implemented for P1. Q1 is equivalent but we need to adjust scaling for the reference element.");
4005 UN FEloc = checkFE(dim,FEType);
4007 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
4009 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
4011 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
4013 vec2D_dbl_ptr_Type phi;
4015 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
4025 vec_dbl_Type v_i(dim);
4026 vec_dbl_Type v_j(dim);
4031 refElementSize = 0.5;
4032 refElementScale = 1./9.;
4035 refElementSize = 1./6.;
4036 refElementScale = 1./16.;
4039 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Only implemented for 2D and 3D.");
4041 for (UN T=0; T<elements->numberElements(); T++) {
4044 detB = B.computeDet( );
4045 absDetB = std::fabs(detB);
4047 for (UN i=0; i < phi->at(0).size(); i++) {
4048 Teuchos::Array<SC> value( phi->at(0).size(), 0. );
4049 Teuchos::Array<GO> indices( phi->at(0).size(), 0 );
4050 for (UN j=0; j < value.size(); j++) {
4051 for (UN w=0; w<phi->size(); w++) {
4052 value[j] += weights->at(w) * (*phi)[w][i] * (*phi)[w][j];
4054 value[j] *= absDetB;
4055 value[j] -= refElementSize * absDetB * refElementScale;
4057 indices[j] = map->getGlobalElement( elements->getElement(T).getNode(j) );
4060 GO row = map->getGlobalElement( elements->getElement(T).getNode(i) );
4061 A->insertGlobalValues( row, indices(), value() );
4066 if (callFillComplete)
4072template <
class SC,
class LO,
class GO,
class NO>
4076 CoeffFuncDbl_Type func,
4078 bool callFillComplete)
4080 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
4081 int FEloc = this->checkFE(dim,FEType);
4083 DomainConstPtr_Type domain = domainVec_.at(FEloc);
4084 ElementsPtr_Type elements = domain->getElementsC();
4085 vec2D_dbl_ptr_Type pointsRep = domain->getPointsRepeated();
4086 MapConstPtr_Type map = domain->getMapRepeated();
4088 vec3D_dbl_ptr_Type dPhi;
4089 vec_dbl_ptr_Type weightsDPhi = Teuchos::rcp(
new vec_dbl_Type(0));
4090 vec2D_dbl_ptr_Type quadPts;
4107 vec_dbl_ptr_Type dist = domain->getDistancesToInterface();
4110 double val, value1_j, value2_j , value1_i, value2_i;
4111 vec_dbl_Type p1(3,0.0), p2(3,0.0), p3(3,0.0);
4113 double distance1, distance2, distance3;
4114 vec_dbl_Type distance_mean(1);
4115 for (
int T = 0; T < elements->numberElements(); T++)
4117 p1 = pointsRep->at(elements->getElement(T).getNode(0));
4118 p2 = pointsRep->at(elements->getElement(T).getNode(1));
4119 p3 = pointsRep->at(elements->getElement(T).getNode(2));
4121 distance1 = dist->at(elements->getElement(T).getNode(0));
4122 distance2 = dist->at(elements->getElement(T).getNode(1));
4123 distance3 = dist->at(elements->getElement(T).getNode(2));
4125 distance_mean.at(0) = (distance1 + distance2 + distance3)/3.0;
4126 double funcvalue = func(&distance_mean.at(0),parameters);
4129 detB = B.computeInverse(Binv);
4130 absDetB = std::fabs(detB);
4133 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
4134 applyBTinv( dPhi, dPhiTrans, Binv );
4136 for (
int i = 0; i < dPhi->at(0).size(); i++)
4138 Teuchos::Array<SC> value( 1, 0. );
4139 Teuchos::Array<GO> indices( 1, 0 );
4141 for (
int j = 0; j < dPhi->at(0).size(); j++)
4144 for (
int k = 0; k < dPhi->size(); k++)
4147 value1_j = dPhiTrans.at(k).at(j).at(0);
4148 value2_j = dPhiTrans.at(k).at(j).at(1);
4150 value1_i = dPhiTrans.at(k).at(i).at(0);
4151 value2_i = dPhiTrans.at(k).at(i).at(1);
4153 val = val + funcvalue * weightsDPhi->at(k) * ( value1_j*value1_i + value2_j*value2_i );
4155 val = absDetB * val;
4158 glob_j = dim * map->getGlobalElement(elements->getElement(T).getNode(j));
4159 glob_i = dim * map->getGlobalElement(elements->getElement(T).getNode(i));
4160 indices[0] = glob_j;
4163 A->insertGlobalValues(glob_i, indices(), value());
4165 indices[0] = glob_j;
4166 A->insertGlobalValues(glob_i+1, indices(), value());
4170 if (callFillComplete)
4177 double val, value1_j, value2_j ,value3_j, value1_i, value2_i ,value3_i;
4179 long long glob_i, glob_j;
4180 vec_dbl_Type p1(3,0.0), p2(3,0.0), p3(3,0.0), p4(3,0.0);
4182 double distance1, distance2, distance3, distance4;
4183 vec_dbl_Type distance_mean(1);
4184 for (
int T = 0; T < elements->numberElements(); T++)
4186 p1 = pointsRep->at(elements->getElement(T).getNode(0));
4187 p2 = pointsRep->at(elements->getElement(T).getNode(1));
4188 p3 = pointsRep->at(elements->getElement(T).getNode(2));
4189 p4 = pointsRep->at(elements->getElement(T).getNode(3));
4191 distance1 = dist->at(elements->getElement(T).getNode(0));
4192 distance2 = dist->at(elements->getElement(T).getNode(1));
4193 distance3 = dist->at(elements->getElement(T).getNode(2));
4194 distance4 = dist->at(elements->getElement(T).getNode(3));
4196 distance_mean.at(0) = (distance1 + distance2 + distance3 + distance4)/4.0;
4197 double funcvalue = func(&distance_mean.at(0),parameters);
4200 detB = B.computeInverse(Binv);
4201 absDetB = std::fabs(detB);
4204 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
4205 applyBTinv( dPhi, dPhiTrans, Binv );
4207 for (
int i = 0; i < dPhi->at(0).size(); i++)
4209 Teuchos::Array<SC> value( 1, 0. );
4210 Teuchos::Array<GO> indices( 1, 0 );
4212 for (
int j = 0; j < dPhi->at(0).size(); j++)
4215 for (
int k = 0; k < dPhi->size(); k++)
4217 value1_j = dPhiTrans.at(k).at(j).at(0);
4218 value2_j = dPhiTrans.at(k).at(j).at(1);
4219 value3_j = dPhiTrans.at(k).at(j).at(2);
4221 value1_i = dPhiTrans.at(k).at(i).at(0);
4222 value2_i = dPhiTrans.at(k).at(i).at(1);
4223 value3_i = dPhiTrans.at(k).at(i).at(2);
4225 val = val + funcvalue * weightsDPhi->at(k) * (value1_j*value1_i + value2_j*value2_i + value3_j*value3_i);
4227 val = absDetB * val;
4230 glob_j = dim * map->getGlobalElement(elements->getElement(T).getNode(j));
4231 glob_i = dim * map->getGlobalElement(elements->getElement(T).getNode(i));
4232 indices[0] = glob_j;
4233 A->insertGlobalValues(glob_i, indices(), value());
4235 indices[0] = glob_j;
4236 A->insertGlobalValues(glob_i+1, indices(), value());
4238 indices[0] = glob_j;
4239 A->insertGlobalValues(glob_i+2, indices(), value());
4244 if (callFillComplete)
4254template <
class SC,
class LO,
class GO,
class NO>
4258 CoeffFunc_Type func,
4260 bool callFillComplete)
4263 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
4264 int FEloc = this->checkFE(dim,FEType);
4266 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
4267 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
4268 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
4270 vec3D_dbl_ptr_Type dPhi;
4271 vec_dbl_ptr_Type weightsDPhi = Teuchos::rcp(
new vec_dbl_Type(0));
4272 vec2D_dbl_ptr_Type quadPts;
4290 double v11, v12, v21, v22, value1_j, value2_j , value1_i, value2_i;
4291 double e_11_j_1,e_12_j_1,e_21_j_1,e_22_j_1;
4292 double e_11_j_2,e_12_j_2,e_21_j_2,e_22_j_2;
4293 double e_11_i_1,e_12_i_1,e_21_i_1,e_22_i_1;
4294 double e_11_i_2,e_12_i_2,e_21_i_2,e_22_i_2;
4303 long long glob_i, glob_j;
4304 vec_dbl_Type p1(3,0.0), p2(3,0.0), p3(3,0.0);
4307 for (
int T = 0; T < elements->numberElements(); T++)
4309 p1 = pointsRep->at(elements->getElement(T).getNode(0));
4310 p2 = pointsRep->at(elements->getElement(T).getNode(1));
4311 p3 = pointsRep->at(elements->getElement(T).getNode(2));
4314 detB = B.computeInverse(Binv);
4315 absDetB = std::fabs(detB);
4319 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
4320 applyBTinv( dPhi, dPhiTrans, Binv );
4322 for (
int i = 0; i < dPhi->at(0).size(); i++)
4324 Teuchos::Array<SC> value11( 1, 0. );
4325 Teuchos::Array<SC> value12( 1, 0. );
4326 Teuchos::Array<SC> value21( 1, 0. );
4327 Teuchos::Array<SC> value22( 1, 0. );
4328 Teuchos::Array<GO> indices( 1, 0 );
4330 for (
int j=0; j < dPhi->at(0).size(); j++)
4332 v11 = 0.0;v12 = 0.0;v21 = 0.0;v22 = 0.0;
4333 for (
int k = 0; k < dPhi->size(); k++)
4338 for (
int r=0; r<2; r++) {
4339 xy[0] += B[0][r]*quadPts->at(k).at(r);
4340 xy[1] += B[1][r]*quadPts->at(k).at(r);
4345 value1_j = dPhiTrans.at(k).at(j).at(0);
4346 value2_j = dPhiTrans.at(k).at(j).at(1);
4348 value1_i = dPhiTrans.at(k).at(i).at(0);
4349 value2_i = dPhiTrans.at(k).at(i).at(1);
4351 tmpRes1[0][0] = value1_j;
4352 tmpRes1[0][1] = value2_j;
4356 tmpRes2[0][0] = value1_j;
4358 tmpRes2[1][0] = value2_j;
4361 tmpRes1.add(tmpRes2,e1j);
4363 e1i[0][0] = value1_i;
4364 e1i[0][1] = value2_i;
4369 tmpRes1[1][0] = value1_j;
4370 tmpRes1[1][1] = value2_j;
4373 tmpRes2[0][1] = value1_j;
4375 tmpRes2[1][1] = value2_j;
4377 tmpRes1.add(tmpRes2,e2j);
4379 e2i[1][0] = value1_i;
4380 e2i[1][1] = value2_i;
4382 double funcvalue = func(&xy.at(0),parameters);
4383 v11 = v11 + funcvalue * weightsDPhi->at(k) * e1i.innerProduct(e1j);
4384 v12 = v12 + funcvalue * weightsDPhi->at(k) * e1i.innerProduct(e2j);
4385 v21 = v21 + funcvalue * weightsDPhi->at(k) * e2i.innerProduct(e1j);
4386 v22 = v22 + funcvalue * weightsDPhi->at(k) * e2i.innerProduct(e2j);
4390 v11 = absDetB * v11;
4391 v12 = absDetB * v12;
4392 v21 = absDetB * v21;
4393 v22 = absDetB * v22;
4400 glob_j = dim * map->getGlobalElement(elements->getElement(T).getNode(j));
4401 glob_i = dim * map->getGlobalElement(elements->getElement(T).getNode(i));
4402 indices[0] = glob_j;
4404 A->insertGlobalValues(glob_i, indices(), value11());
4405 A->insertGlobalValues(glob_i+1, indices(), value21());
4407 indices[0] = glob_j;
4408 A->insertGlobalValues(glob_i, indices(), value12());
4409 A->insertGlobalValues(glob_i+1, indices(), value22());
4413 if (callFillComplete)
4420 double v11, v12, v13, v21, v22, v23, v31, v32, v33, value1_j, value2_j, value3_j , value1_i, value2_i, value3_i;
4429 vec_dbl_Type p1(3,0.0), p2(3,0.0), p3(3,0.0), p4(3,0.0);
4430 vec_dbl_Type xyz(3);
4432 for (
int T = 0; T < elements->numberElements(); T++)
4434 p1 = pointsRep->at(elements->getElement(T).getNode(0));
4435 p2 = pointsRep->at(elements->getElement(T).getNode(1));
4436 p3 = pointsRep->at(elements->getElement(T).getNode(2));
4437 p4 = pointsRep->at(elements->getElement(T).getNode(3));
4440 detB = B.computeInverse(Binv);
4441 absDetB = std::fabs(detB);
4444 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
4445 applyBTinv( dPhi, dPhiTrans, Binv );
4447 for (
int i = 0; i < dPhi->at(0).size(); i++)
4449 Teuchos::Array<SC> value11( 1, 0. );
4450 Teuchos::Array<SC> value12( 1, 0. );
4451 Teuchos::Array<SC> value13( 1, 0. );
4452 Teuchos::Array<SC> value21( 1, 0. );
4453 Teuchos::Array<SC> value22( 1, 0. );
4454 Teuchos::Array<SC> value23( 1, 0. );
4455 Teuchos::Array<SC> value31( 1, 0. );
4456 Teuchos::Array<SC> value32( 1, 0. );
4457 Teuchos::Array<SC> value33( 1, 0. );
4458 Teuchos::Array<GO> indices( 1, 0 );
4460 for (
int j = 0; j < dPhi->at(0).size(); j++)
4462 v11 = 0.0;v12 = 0.0;v13 = 0.0;v21 = 0.0;v22 = 0.0;v23 = 0.0;v31 = 0.0;v32 = 0.0;v33 = 0.0;
4463 for (
int k = 0; k < dPhi->size(); k++)
4466 xyz[0]=0.; xyz[1]=0.; xyz[2]=0.;
4467 for (
int r = 0; r < 3; r++)
4469 xyz[0] += B[0][r]*quadPts->at(k).at(r);
4470 xyz[1] += B[1][r]*quadPts->at(k).at(r);
4471 xyz[2] += B[2][r]*quadPts->at(k).at(r);
4479 value1_j = dPhiTrans.at(k).at(j).at(0);
4480 value2_j = dPhiTrans.at(k).at(j).at(1);
4481 value3_j = dPhiTrans.at(k).at(j).at(2);
4484 value1_i = dPhiTrans.at(k).at(i).at(0);
4485 value2_i = dPhiTrans.at(k).at(i).at(1);
4486 value3_i = dPhiTrans.at(k).at(i).at(2);
4489 e1j[0][0] = 2.*value1_j;
4490 e1j[0][1] = value2_j;
4491 e1j[0][2] = value3_j;
4492 e1j[1][0] = value2_j;
4493 e1j[2][0] = value3_j;
4495 e1i[0][0] = value1_i;
4496 e1i[0][1] = value2_i;
4497 e1i[0][2] = value3_i;
4500 e2j[1][0] = value1_j;
4501 e2j[1][1] = 2.*value2_j;
4502 e2j[1][2] = value3_j;
4503 e2j[0][1] = value1_j;
4504 e2j[2][1] = value3_j;
4506 e2i[1][0] = value1_i;
4507 e2i[1][1] = value2_i;
4508 e2i[1][2] = value3_i;
4511 e3j[2][0] = value1_j;
4512 e3j[2][1] = value2_j;
4513 e3j[2][2] = 2.*value3_j;
4514 e3j[0][2] = value1_j;
4515 e3j[1][2] = value2_j;
4517 e3i[2][0] = value1_i;
4518 e3i[2][1] = value2_i;
4519 e3i[2][2] = value3_i;
4521 double funcvalue = func(&xyz.at(0),parameters);
4523 v11 = v11 + funcvalue * weightsDPhi->at(k) * e1i.innerProduct(e1j);
4524 v12 = v12 + funcvalue * weightsDPhi->at(k) * e1i.innerProduct(e2j);
4525 v13 = v13 + funcvalue * weightsDPhi->at(k) * e1i.innerProduct(e3j);
4527 v21 = v21 + funcvalue * weightsDPhi->at(k) * e2i.innerProduct(e1j);
4528 v22 = v22 + funcvalue * weightsDPhi->at(k) * e2i.innerProduct(e2j);
4529 v23 = v23 + funcvalue * weightsDPhi->at(k) * e2i.innerProduct(e3j);
4531 v31 = v31 + funcvalue * weightsDPhi->at(k) * e3i.innerProduct(e1j);
4532 v32 = v32 + funcvalue * weightsDPhi->at(k) * e3i.innerProduct(e2j);
4533 v33 = v33 + funcvalue * weightsDPhi->at(k) * e3i.innerProduct(e3j);
4537 v11 = absDetB * v11;
4538 v12 = absDetB * v12;
4539 v13 = absDetB * v13;
4540 v21 = absDetB * v21;
4541 v22 = absDetB * v22;
4542 v23 = absDetB * v23;
4543 v31 = absDetB * v31;
4544 v32 = absDetB * v32;
4545 v33 = absDetB * v33;
4557 glob_j = dim * map->getGlobalElement(elements->getElement(T).getNode(j));
4558 glob_i = dim * map->getGlobalElement(elements->getElement(T).getNode(i));
4559 indices[0] = glob_j;
4560 A->insertGlobalValues(glob_i, indices(), value11());
4561 A->insertGlobalValues(glob_i+1, indices(), value21());
4562 A->insertGlobalValues(glob_i+2, indices(), value31());
4565 indices[0] = glob_j;
4566 A->insertGlobalValues(glob_i, indices(), value12());
4567 A->insertGlobalValues(glob_i+1, indices(), value22());
4568 A->insertGlobalValues(glob_i+2, indices(), value32());
4571 indices[0] = glob_j;
4572 A->insertGlobalValues(glob_i, indices(), value13());
4573 A->insertGlobalValues(glob_i+1, indices(), value23());
4574 A->insertGlobalValues(glob_i+2, indices(), value33());
4578 if (callFillComplete)
4588template <
class SC,
class LO,
class GO,
class NO>
4594 bool callFillComplete)
4596 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
4597 int FEloc = this->checkFE(dim,FEType);
4600 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
4601 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
4602 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
4604 vec3D_dbl_ptr_Type dPhi;
4605 vec_dbl_ptr_Type weightsDPhi = Teuchos::rcp(
new vec_dbl_Type(0));
4606 vec2D_dbl_ptr_Type quadPts;
4628 double res_trace_i, res_trace_j;
4633 double v11, v12, v21, v22;
4635 vec_dbl_Type p1(2,0.0), p2(2,0.0), p3(2,0.0);
4640 epsilonValuesMat1_j(dim), epsilonValuesMat2_j(dim);
4642 for (
int T = 0; T < elements->numberElements(); T++)
4645 p1 = pointsRep->at(elements->getElement(T).getNode(0));
4646 p2 = pointsRep->at(elements->getElement(T).getNode(1));
4647 p3 = pointsRep->at(elements->getElement(T).getNode(2));
4651 detB = B.computeInverse(Binv);
4652 absDetB = std::fabs(detB);
4656 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
4657 applyBTinv( dPhi, dPhiTrans, Binv );
4659 for (
int i = 0; i < dPhi->at(0).size(); i++)
4661 Teuchos::Array<SC> value11( 1, 0. );
4662 Teuchos::Array<SC> value12( 1, 0. );
4663 Teuchos::Array<SC> value21( 1, 0. );
4664 Teuchos::Array<SC> value22( 1, 0. );
4665 Teuchos::Array<GO> indices( 1, 0 );
4667 for (
int j = 0; j < dPhi->at(0).size(); j++)
4669 v11 = 0.0; v12 = 0.0; v21 = 0.0; v22 = 0.0;
4670 for (
int k = 0; k < dPhi->size(); k++)
4680 epsilonTensor( dPhiTrans.at(k).at(i), epsilonValuesMat1_i, 0);
4681 epsilonTensor( dPhiTrans.at(k).at(i), epsilonValuesMat2_i, 1);
4687 epsilonTensor( dPhiTrans.at(k).at(j), epsilonValuesMat1_j, 0);
4688 epsilonTensor( dPhiTrans.at(k).at(j), epsilonValuesMat2_j, 1);
4693 epsilonValuesMat1_i.innerProduct(epsilonValuesMat1_j, res);
4694 epsilonValuesMat1_i.trace(res_trace_i);
4695 epsilonValuesMat1_j.trace(res_trace_j);
4696 v11 = v11 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
4698 epsilonValuesMat1_i.innerProduct(epsilonValuesMat2_j, res);
4699 epsilonValuesMat1_i.trace(res_trace_i);
4700 epsilonValuesMat2_j.trace(res_trace_j);
4701 v12 = v12 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
4703 epsilonValuesMat2_i.innerProduct(epsilonValuesMat1_j, res);
4704 epsilonValuesMat2_i.trace(res_trace_i);
4705 epsilonValuesMat1_j.trace(res_trace_j);
4706 v21 = v21 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
4708 epsilonValuesMat2_i.innerProduct(epsilonValuesMat2_j, res);
4709 epsilonValuesMat2_i.trace(res_trace_i);
4710 epsilonValuesMat2_j.trace(res_trace_j);
4711 v22 = v22 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
4716 v11 = absDetB * v11;
4717 v12 = absDetB * v12;
4718 v21 = absDetB * v21;
4719 v22 = absDetB * v22;
4727 glob_j = dim * map->getGlobalElement(elements->getElement(T).getNode(j));
4728 glob_i = dim * map->getGlobalElement(elements->getElement(T).getNode(i));
4729 indices[0] = glob_j;
4730 A->insertGlobalValues(glob_i, indices(), value11());
4731 A->insertGlobalValues(glob_i+1, indices(), value21());
4733 indices[0] = glob_j;
4734 A->insertGlobalValues(glob_i, indices(), value12());
4735 A->insertGlobalValues(glob_i+1, indices(), value22());
4739 if (callFillComplete)
4747 double v11, v12, v13, v21, v22, v23, v31, v32, v33;
4749 vec_dbl_Type p1(3,0.0), p2(3,0.0), p3(3,0.0), p4(3,0.0);
4750 SmallMatrix<double> epsilonValuesMat1_i(dim), epsilonValuesMat2_i(dim), epsilonValuesMat3_i(dim),
4751 epsilonValuesMat1_j(dim), epsilonValuesMat2_j(dim), epsilonValuesMat3_j(dim);
4753 for (
int T = 0; T < elements->numberElements(); T++)
4755 p1 = pointsRep->at(elements->getElement(T).getNode(0));
4756 p2 = pointsRep->at(elements->getElement(T).getNode(1));
4757 p3 = pointsRep->at(elements->getElement(T).getNode(2));
4758 p4 = pointsRep->at(elements->getElement(T).getNode(3));
4761 detB = B.computeInverse(Binv);
4762 absDetB = std::fabs(detB);
4765 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
4766 applyBTinv( dPhi, dPhiTrans, Binv );
4768 for (
int i = 0; i < dPhi->at(0).size(); i++)
4770 Teuchos::Array<SC> value11( 1, 0. );
4771 Teuchos::Array<SC> value12( 1, 0. );
4772 Teuchos::Array<SC> value13( 1, 0. );
4773 Teuchos::Array<SC> value21( 1, 0. );
4774 Teuchos::Array<SC> value22( 1, 0. );
4775 Teuchos::Array<SC> value23( 1, 0. );
4776 Teuchos::Array<SC> value31( 1, 0. );
4777 Teuchos::Array<SC> value32( 1, 0. );
4778 Teuchos::Array<SC> value33( 1, 0. );
4779 Teuchos::Array<GO> indices( 1, 0 );
4781 for (
int j = 0; j < dPhi->at(0).size(); j++)
4783 v11 = 0.0; v12 = 0.0; v13 = 0.0; v21 = 0.0; v22 = 0.0; v23 = 0.0; v31 = 0.0; v32 = 0.0; v33 = 0.0;
4784 for (
int k = 0; k < dPhi->size(); k++)
4789 epsilonTensor( dPhiTrans.at(k).at(i), epsilonValuesMat1_i, 0);
4790 epsilonTensor( dPhiTrans.at(k).at(i), epsilonValuesMat2_i, 1);
4791 epsilonTensor( dPhiTrans.at(k).at(i), epsilonValuesMat3_i, 2);
4796 epsilonTensor( dPhiTrans.at(k).at(j), epsilonValuesMat1_j, 0);
4797 epsilonTensor( dPhiTrans.at(k).at(j), epsilonValuesMat2_j, 1);
4798 epsilonTensor( dPhiTrans.at(k).at(j), epsilonValuesMat3_j, 2);
4800 epsilonValuesMat1_i.innerProduct(epsilonValuesMat1_j, res);
4801 epsilonValuesMat1_i.trace(res_trace_i);
4802 epsilonValuesMat1_j.trace(res_trace_j);
4803 v11 = v11 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
4805 epsilonValuesMat1_i.innerProduct(epsilonValuesMat2_j, res);
4806 epsilonValuesMat1_i.trace(res_trace_i);
4807 epsilonValuesMat2_j.trace(res_trace_j);
4808 v12 = v12 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
4810 epsilonValuesMat1_i.innerProduct(epsilonValuesMat3_j, res);
4811 epsilonValuesMat1_i.trace(res_trace_i);
4812 epsilonValuesMat3_j.trace(res_trace_j);
4813 v13 = v13 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
4815 epsilonValuesMat2_i.innerProduct(epsilonValuesMat1_j, res);
4816 epsilonValuesMat2_i.trace(res_trace_i);
4817 epsilonValuesMat1_j.trace(res_trace_j);
4818 v21 = v21 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
4820 epsilonValuesMat2_i.innerProduct(epsilonValuesMat2_j, res);
4821 epsilonValuesMat2_i.trace(res_trace_i);
4822 epsilonValuesMat2_j.trace(res_trace_j);
4823 v22 = v22 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
4825 epsilonValuesMat2_i.innerProduct(epsilonValuesMat3_j, res);
4826 epsilonValuesMat2_i.trace(res_trace_i);
4827 epsilonValuesMat3_j.trace(res_trace_j);
4828 v23 = v23 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
4830 epsilonValuesMat3_i.innerProduct(epsilonValuesMat1_j, res);
4831 epsilonValuesMat3_i.trace(res_trace_i);
4832 epsilonValuesMat1_j.trace(res_trace_j);
4833 v31 = v31 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
4835 epsilonValuesMat3_i.innerProduct(epsilonValuesMat2_j, res);
4836 epsilonValuesMat3_i.trace(res_trace_i);
4837 epsilonValuesMat2_j.trace(res_trace_j);
4838 v32 = v32 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
4840 epsilonValuesMat3_i.innerProduct(epsilonValuesMat3_j, res);
4841 epsilonValuesMat3_i.trace(res_trace_i);
4842 epsilonValuesMat3_j.trace(res_trace_j);
4843 v33 = v33 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
4846 v11 = absDetB * v11;
4847 v12 = absDetB * v12;
4848 v13 = absDetB * v13;
4849 v21 = absDetB * v21;
4850 v22 = absDetB * v22;
4851 v23 = absDetB * v23;
4852 v31 = absDetB * v31;
4853 v32 = absDetB * v32;
4854 v33 = absDetB * v33;
4866 glob_j = dim * map->getGlobalElement(elements->getElement(T).getNode(j));
4867 glob_i = dim * map->getGlobalElement(elements->getElement(T).getNode(i));
4868 indices[0] = glob_j;
4869 A->insertGlobalValues(glob_i, indices(), value11());
4870 A->insertGlobalValues(glob_i+1, indices(), value21());
4871 A->insertGlobalValues(glob_i+2, indices(), value31());
4873 indices[0] = glob_j;
4874 A->insertGlobalValues(glob_i, indices(), value12());
4875 A->insertGlobalValues(glob_i+1, indices(), value22());
4876 A->insertGlobalValues(glob_i+2, indices(), value32());
4878 indices[0] = glob_j;
4879 A->insertGlobalValues(glob_i, indices(), value13());
4880 A->insertGlobalValues(glob_i+1, indices(), value23());
4881 A->insertGlobalValues(glob_i+2, indices(), value33());
4885 if (callFillComplete)
4893template <
class SC,
class LO,
class GO,
class NO>
4894void FE<SC,LO,GO,NO>::determineEMod(std::string FEType, MultiVectorPtr_Type solution,MultiVectorPtr_Type &eModVec, DomainConstPtr_Type domain, ParameterListPtr_Type params){
4897 ElementsPtr_Type elements = domain->getElementsC();
4899 int dim = domain->getDimension();
4900 vec2D_dbl_ptr_Type pointsRep = domain->getPointsRepeated();
4904 Teuchos::ArrayRCP< const SC > uArray = solution->getData(0);
4905 Teuchos::ArrayRCP< SC > eModVecA = eModVec->getDataNonConst(0);
4907 double E0 = params->sublist(
"Parameter Solid").get(
"E",3.0e+6);
4908 double E1 = params->sublist(
"Parameter Solid").get(
"E1",3.0e+5);
4909 double c1 = params->sublist(
"Parameter Solid").get(
"c1",1.0);
4911 double eModMin = E0;
4913 int nodesElement = elements->getElement(0).getVectorNodeList().size();
4914 for (UN T=0; T<elements->numberElements(); T++) {
4922 for(
int i=0; i< nodesElement;i++){
4923 LO index = elements->getElement(T).getNode(i) ;
4924 uLoc += 1./nodesElement*uArray[index];
4927 eModVecA[T] = E0-(E0-E1)*(uLoc/(uLoc+c1));
4928 if(eModVecA[T] > eModMax )
4929 eModMax = eModVecA[T];
4930 if(eModVecA[T] < eModMin)
4931 eModMin = eModVecA[T];
4933 Teuchos::reduceAll<int, double> (*(domain->getComm()), Teuchos::REDUCE_MIN, eModMin, Teuchos::outArg (eModMin));
4934 Teuchos::reduceAll<int, double> (*(domain->getComm()), Teuchos::REDUCE_MAX, eModMax, Teuchos::outArg (eModMax));
4936 if(domain->getComm()->getRank()==0)
4937 std::cout <<
" ################# eMOD Min: " << eModMin <<
" \t eModMax: " << eModMax<<
" ############# " << std::endl;
4944template <
class SC,
class LO,
class GO,
class NO>
4948 MultiVectorPtr_Type eModVec,
4950 bool callFillComplete)
4952 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
4953 int FEloc = this->checkFE(dim,FEType);
4955 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
4956 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
4957 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
4959 vec3D_dbl_ptr_Type dPhi;
4960 vec_dbl_ptr_Type weightsDPhi = Teuchos::rcp(
new vec_dbl_Type(0));
4961 vec2D_dbl_ptr_Type quadPts;
4979 double res_trace_i, res_trace_j;
4981 Teuchos::ArrayRCP< const SC > E = eModVec->getData(0);
4988 double v11, v12, v21, v22;
4990 vec_dbl_Type p1(2,0.0), p2(2,0.0), p3(2,0.0);
4995 epsilonValuesMat1_j(dim), epsilonValuesMat2_j(dim);
4997 for (
int T = 0; T < elements->numberElements(); T++)
5000 lambda = E[T]* nu / ((1.+nu)*(1.-2.*nu));
5001 mu = E[T] / (2.*(1.+nu));
5004 p1 = pointsRep->at(elements->getElement(T).getNode(0));
5005 p2 = pointsRep->at(elements->getElement(T).getNode(1));
5006 p3 = pointsRep->at(elements->getElement(T).getNode(2));
5010 detB = B.computeInverse(Binv);
5011 absDetB = std::fabs(detB);
5015 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
5016 applyBTinv( dPhi, dPhiTrans, Binv );
5018 for (
int i = 0; i < dPhi->at(0).size(); i++)
5020 Teuchos::Array<SC> value11( 1, 0. );
5021 Teuchos::Array<SC> value12( 1, 0. );
5022 Teuchos::Array<SC> value21( 1, 0. );
5023 Teuchos::Array<SC> value22( 1, 0. );
5024 Teuchos::Array<GO> indices( 1, 0 );
5026 for (
int j = 0; j < dPhi->at(0).size(); j++)
5028 v11 = 0.0; v12 = 0.0; v21 = 0.0; v22 = 0.0;
5029 for (
int k = 0; k < dPhi->size(); k++)
5039 epsilonTensor( dPhiTrans.at(k).at(i), epsilonValuesMat1_i, 0);
5040 epsilonTensor( dPhiTrans.at(k).at(i), epsilonValuesMat2_i, 1);
5046 epsilonTensor( dPhiTrans.at(k).at(j), epsilonValuesMat1_j, 0);
5047 epsilonTensor( dPhiTrans.at(k).at(j), epsilonValuesMat2_j, 1);
5052 epsilonValuesMat1_i.innerProduct(epsilonValuesMat1_j, res);
5053 epsilonValuesMat1_i.trace(res_trace_i);
5054 epsilonValuesMat1_j.trace(res_trace_j);
5055 v11 = v11 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5057 epsilonValuesMat1_i.innerProduct(epsilonValuesMat2_j, res);
5058 epsilonValuesMat1_i.trace(res_trace_i);
5059 epsilonValuesMat2_j.trace(res_trace_j);
5060 v12 = v12 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5062 epsilonValuesMat2_i.innerProduct(epsilonValuesMat1_j, res);
5063 epsilonValuesMat2_i.trace(res_trace_i);
5064 epsilonValuesMat1_j.trace(res_trace_j);
5065 v21 = v21 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5067 epsilonValuesMat2_i.innerProduct(epsilonValuesMat2_j, res);
5068 epsilonValuesMat2_i.trace(res_trace_i);
5069 epsilonValuesMat2_j.trace(res_trace_j);
5070 v22 = v22 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5075 v11 = absDetB * v11;
5076 v12 = absDetB * v12;
5077 v21 = absDetB * v21;
5078 v22 = absDetB * v22;
5086 glob_j = dim * map->getGlobalElement(elements->getElement(T).getNode(j));
5087 glob_i = dim * map->getGlobalElement(elements->getElement(T).getNode(i));
5088 indices[0] = glob_j;
5089 A->insertGlobalValues(glob_i, indices(), value11());
5090 A->insertGlobalValues(glob_i+1, indices(), value21());
5092 indices[0] = glob_j;
5093 A->insertGlobalValues(glob_i, indices(), value12());
5094 A->insertGlobalValues(glob_i+1, indices(), value22());
5098 if (callFillComplete)
5106 double v11, v12, v13, v21, v22, v23, v31, v32, v33;
5108 vec_dbl_Type p1(3,0.0), p2(3,0.0), p3(3,0.0), p4(3,0.0);
5109 SmallMatrix<double> epsilonValuesMat1_i(dim), epsilonValuesMat2_i(dim), epsilonValuesMat3_i(dim),
5110 epsilonValuesMat1_j(dim), epsilonValuesMat2_j(dim), epsilonValuesMat3_j(dim);
5112 for (
int T = 0; T < elements->numberElements(); T++)
5114 lambda = E[T]* nu / ((1.+nu)*(1.-2.*nu));
5115 mu = E[T] / (2.*(1.+nu));
5117 p1 = pointsRep->at(elements->getElement(T).getNode(0));
5118 p2 = pointsRep->at(elements->getElement(T).getNode(1));
5119 p3 = pointsRep->at(elements->getElement(T).getNode(2));
5120 p4 = pointsRep->at(elements->getElement(T).getNode(3));
5123 detB = B.computeInverse(Binv);
5124 absDetB = std::fabs(detB);
5127 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
5128 applyBTinv( dPhi, dPhiTrans, Binv );
5130 for (
int i = 0; i < dPhi->at(0).size(); i++)
5133 Teuchos::Array<SC> value11( 1, 0. );
5134 Teuchos::Array<SC> value12( 1, 0. );
5135 Teuchos::Array<SC> value13( 1, 0. );
5136 Teuchos::Array<SC> value21( 1, 0. );
5137 Teuchos::Array<SC> value22( 1, 0. );
5138 Teuchos::Array<SC> value23( 1, 0. );
5139 Teuchos::Array<SC> value31( 1, 0. );
5140 Teuchos::Array<SC> value32( 1, 0. );
5141 Teuchos::Array<SC> value33( 1, 0. );
5142 Teuchos::Array<GO> indices( 1, 0 );
5144 for (
int j = 0; j < dPhi->at(0).size(); j++)
5146 v11 = 0.0; v12 = 0.0; v13 = 0.0; v21 = 0.0; v22 = 0.0; v23 = 0.0; v31 = 0.0; v32 = 0.0; v33 = 0.0;
5147 for (
int k = 0; k < dPhi->size(); k++)
5152 epsilonTensor( dPhiTrans.at(k).at(i), epsilonValuesMat1_i, 0);
5153 epsilonTensor( dPhiTrans.at(k).at(i), epsilonValuesMat2_i, 1);
5154 epsilonTensor( dPhiTrans.at(k).at(i), epsilonValuesMat3_i, 2);
5159 epsilonTensor( dPhiTrans.at(k).at(j), epsilonValuesMat1_j, 0);
5160 epsilonTensor( dPhiTrans.at(k).at(j), epsilonValuesMat2_j, 1);
5161 epsilonTensor( dPhiTrans.at(k).at(j), epsilonValuesMat3_j, 2);
5163 epsilonValuesMat1_i.innerProduct(epsilonValuesMat1_j, res);
5164 epsilonValuesMat1_i.trace(res_trace_i);
5165 epsilonValuesMat1_j.trace(res_trace_j);
5166 v11 = v11 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5168 epsilonValuesMat1_i.innerProduct(epsilonValuesMat2_j, res);
5169 epsilonValuesMat1_i.trace(res_trace_i);
5170 epsilonValuesMat2_j.trace(res_trace_j);
5171 v12 = v12 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5173 epsilonValuesMat1_i.innerProduct(epsilonValuesMat3_j, res);
5174 epsilonValuesMat1_i.trace(res_trace_i);
5175 epsilonValuesMat3_j.trace(res_trace_j);
5176 v13 = v13 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5178 epsilonValuesMat2_i.innerProduct(epsilonValuesMat1_j, res);
5179 epsilonValuesMat2_i.trace(res_trace_i);
5180 epsilonValuesMat1_j.trace(res_trace_j);
5181 v21 = v21 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5183 epsilonValuesMat2_i.innerProduct(epsilonValuesMat2_j, res);
5184 epsilonValuesMat2_i.trace(res_trace_i);
5185 epsilonValuesMat2_j.trace(res_trace_j);
5186 v22 = v22 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5188 epsilonValuesMat2_i.innerProduct(epsilonValuesMat3_j, res);
5189 epsilonValuesMat2_i.trace(res_trace_i);
5190 epsilonValuesMat3_j.trace(res_trace_j);
5191 v23 = v23 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5193 epsilonValuesMat3_i.innerProduct(epsilonValuesMat1_j, res);
5194 epsilonValuesMat3_i.trace(res_trace_i);
5195 epsilonValuesMat1_j.trace(res_trace_j);
5196 v31 = v31 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5198 epsilonValuesMat3_i.innerProduct(epsilonValuesMat2_j, res);
5199 epsilonValuesMat3_i.trace(res_trace_i);
5200 epsilonValuesMat2_j.trace(res_trace_j);
5201 v32 = v32 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5203 epsilonValuesMat3_i.innerProduct(epsilonValuesMat3_j, res);
5204 epsilonValuesMat3_i.trace(res_trace_i);
5205 epsilonValuesMat3_j.trace(res_trace_j);
5206 v33 = v33 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5209 v11 = absDetB * v11;
5210 v12 = absDetB * v12;
5211 v13 = absDetB * v13;
5212 v21 = absDetB * v21;
5213 v22 = absDetB * v22;
5214 v23 = absDetB * v23;
5215 v31 = absDetB * v31;
5216 v32 = absDetB * v32;
5217 v33 = absDetB * v33;
5229 glob_j = dim * map->getGlobalElement(elements->getElement(T).getNode(j));
5230 glob_i = dim * map->getGlobalElement(elements->getElement(T).getNode(i));
5231 indices[0] = glob_j;
5232 A->insertGlobalValues(glob_i, indices(), value11());
5233 A->insertGlobalValues(glob_i+1, indices(), value21());
5234 A->insertGlobalValues(glob_i+2, indices(), value31());
5236 indices[0] = glob_j;
5237 A->insertGlobalValues(glob_i, indices(), value12());
5238 A->insertGlobalValues(glob_i+1, indices(), value22());
5239 A->insertGlobalValues(glob_i+2, indices(), value32());
5241 indices[0] = glob_j;
5242 A->insertGlobalValues(glob_i, indices(), value13());
5243 A->insertGlobalValues(glob_i+1, indices(), value23());
5244 A->insertGlobalValues(glob_i+2, indices(), value33());
5248 if (callFillComplete)
5256template <
class SC,
class LO,
class GO,
class NO>
5260 MultiVectorPtr_Type w,
5261 bool callFillComplete)
5264 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
5265 int FEloc = this->checkFE(dim,FEType);
5267 DomainConstPtr_Type domain = domainVec_.at(FEloc);
5268 ElementsPtr_Type elements = domain->getElementsC();
5269 vec2D_dbl_ptr_Type pointsRep = domain->getPointsRepeated();
5270 MapConstPtr_Type map = domain->getMapRepeated();
5272 vec3D_dbl_ptr_Type dPhi;
5273 vec2D_dbl_ptr_Type phi;
5274 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
5275 vec2D_dbl_ptr_Type quadPts;
5292 Teuchos::ArrayRCP< const SC > wArray = w->getData(0);
5297 vec_dbl_Type p1(3,0.0), p2(3,0.0), p3(3,0.0);
5299 vec2D_dbl_Type w11(1, vec_dbl_Type(weights->size(), -1.));
5300 vec2D_dbl_Type w22(1, vec_dbl_Type(weights->size(), -1.));
5301 vec2D_dbl_Type divergenz(1, vec_dbl_Type(weights->size(), -1.));
5303 for (
int T = 0; T < elements->numberElements(); T++)
5305 p1 = pointsRep->at(elements->getElement(T).getNode(0));
5306 p2 = pointsRep->at(elements->getElement(T).getNode(1));
5307 p3 = pointsRep->at(elements->getElement(T).getNode(2));
5310 detB = B.computeInverse(Binv);
5311 absDetB = std::fabs(detB);
5314 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
5315 applyBTinv( dPhi, dPhiTrans, Binv );
5319 for(
int k = 0; k < dPhiTrans.size(); k++)
5323 for(
int i = 0; i < dPhiTrans[0].size(); i++)
5325 LO index1 = dim * elements->getElement(T).getNode(i) + 0;
5326 LO index2 = dim * elements->getElement(T).getNode(i) + 1;
5327 w11[0][k] += wArray[index1] * dPhiTrans[k][i][0];
5328 w22[0][k] += wArray[index2] * dPhiTrans[k][i][1];
5338 for(
int k = 0; k < dPhiTrans.size(); k++)
5340 divergenz[0][k] = w11[0][k] + w22[0][k];
5348 for (
int i = 0; i < dPhi->at(0).size(); i++)
5350 Teuchos::Array<SC> value( 1, 0. );
5351 Teuchos::Array<GO> indices( 1, 0 );
5353 for (
int j = 0; j < dPhi->at(0).size(); j++)
5356 for (
int k = 0; k < dPhi->size(); k++)
5358 val = val + divergenz[0][k] * weights->at(k) * (*phi)[k][i] * (*phi)[k][j];
5360 val = absDetB * val;
5368 glob_j = dim * map->getGlobalElement(elements->getElement(T).getNode(j));
5369 glob_i = dim * map->getGlobalElement(elements->getElement(T).getNode(i));
5370 indices[0] = glob_j;
5372 A->insertGlobalValues(glob_i, indices(), value());
5374 indices[0] = glob_j;
5375 A->insertGlobalValues(glob_i+1, indices(), value());
5379 if (callFillComplete)
5389 vec_dbl_Type p1(3,0.0), p2(3,0.0), p3(3,0.0), p4(3,0.0);
5391 vec2D_dbl_Type w11(1, vec_dbl_Type(weights->size(), -1.));
5392 vec2D_dbl_Type w22(1, vec_dbl_Type(weights->size(), -1.));
5393 vec2D_dbl_Type w33(1, vec_dbl_Type(weights->size(), -1.));
5394 vec2D_dbl_Type divergenz(1, vec_dbl_Type(weights->size(), -1.));
5396 for (
int T = 0; T < elements->numberElements(); T++)
5398 p1 = pointsRep->at(elements->getElement(T).getNode(0));
5399 p2 = pointsRep->at(elements->getElement(T).getNode(1));
5400 p3 = pointsRep->at(elements->getElement(T).getNode(2));
5401 p4 = pointsRep->at(elements->getElement(T).getNode(3));
5404 detB = B.computeInverse(Binv);
5405 absDetB = std::fabs(detB);
5408 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
5409 applyBTinv( dPhi, dPhiTrans, Binv );
5413 for(
int k = 0; k < dPhiTrans.size(); k++)
5418 for(
int i = 0; i < dPhiTrans[0].size(); i++)
5420 LO index1 = dim * elements->getElement(T).getNode(i) + 0;
5421 LO index2 = dim * elements->getElement(T).getNode(i) + 1;
5422 LO index3 = dim * elements->getElement(T).getNode(i) + 2;
5423 w11[0][k] += wArray[index1] * dPhiTrans[k][i][0];
5424 w22[0][k] += wArray[index2] * dPhiTrans[k][i][1];
5425 w33[0][k] += wArray[index3] * dPhiTrans[k][i][2];
5429 for(
int k = 0; k < dPhiTrans.size(); k++)
5431 divergenz[0][k] = w11[0][k] + w22[0][k] + w33[0][k];
5434 for (
int i = 0; i < dPhi->at(0).size(); i++)
5436 Teuchos::Array<SC> value( 1, 0. );
5437 Teuchos::Array<GO> indices( 1, 0 );
5439 for (
int j = 0; j < dPhi->at(0).size(); j++)
5442 for (
int k = 0; k < dPhi->size(); k++)
5444 val = val + divergenz[0][k] * weights->at(k) * (*phi)[k][i] * (*phi)[k][j];
5446 val = absDetB * val;
5449 glob_j = dim * map->getGlobalElement(elements->getElement(T).getNode(j));
5450 glob_i = dim * map->getGlobalElement(elements->getElement(T).getNode(i));
5451 indices[0] = glob_j;
5452 A->insertGlobalValues(glob_i, indices(), value());
5454 indices[0] = glob_j;
5455 A->insertGlobalValues(glob_i+1, indices(), value());
5457 indices[0] = glob_j;
5458 A->insertGlobalValues(glob_i+2, indices(), value());
5463 if (callFillComplete)
5470template <
class SC,
class LO,
class GO,
class NO>
5471void FE<SC,LO,GO,NO>::assemblyDummyCoupling(
int dim,
5475 bool callFillComplete)
5477 DomainConstPtr_Type domain = domainVec_.at(FEloc);
5479 MapConstPtr_Type mapInterfaceVecField = domain->getInterfaceMapVecFieldUnique();
5480 MapConstPtr_Type mapGlobalInterfaceVecField = domain->getGlobalInterfaceMapVecFieldUnique();
5482 MapConstPtr_Type mapFieldPartial = domain->getGlobalInterfaceMapVecFieldPartial();
5484 Teuchos::Array<SC> value( 1, 0. );
5486 Teuchos::Array<GO> indices( 1, 0 );
5488 GO dofGlobal, dofLocal;
5490 for(
int k = 0; k < mapGlobalInterfaceVecField->getNodeNumElements(); k++)
5492 dofGlobal = mapGlobalInterfaceVecField->getGlobalElement(k);
5493 if ( mapFieldPartial->getLocalElement( dofGlobal ) == Teuchos::OrdinalTraits<LO>::invalid() ) {
5495 dofGlobal = mapInterfaceVecField->getGlobalElement( k );
5496 indices[0] = dofGlobal;
5497 C->insertGlobalValues(dofGlobal, indices(), value());
5501 if (callFillComplete)
5502 C->fillComplete(mapInterfaceVecField, mapInterfaceVecField);
5506template <
class SC,
class LO,
class GO,
class NO>
5507void FE<SC,LO,GO,NO>::assemblyFSICoupling(
int dim,
5510 MatrixPtr_Type &C_T,
5513 MapConstPtr_Type map1,
5514 MapConstPtr_Type map2,
5515 bool callFillComplete)
5519 DomainConstPtr_Type domain1 = domainVec_.at(FEloc1);
5521 MapConstPtr_Type mapInterfaceVecField = domain1->getInterfaceMapVecFieldUnique();
5523 MapConstPtr_Type mapGlobalInterfaceVecField;
5524 MapConstPtr_Type mapFieldPartial;
5525 if (FEloc1!=FEloc2){
5526 mapFieldPartial = domain1->getOtherGlobalInterfaceMapVecFieldPartial();
5527 mapGlobalInterfaceVecField = domain1->getOtherGlobalInterfaceMapVecFieldUnique();
5530 mapFieldPartial = domain1->getGlobalInterfaceMapVecFieldPartial();
5531 mapGlobalInterfaceVecField = domain1->getGlobalInterfaceMapVecFieldUnique();
5534 Teuchos::Array<SC> value( 1, 0. );
5536 Teuchos::Array<GO> indices( 1, 0 );
5538 GO dofGlobal, dofLocal;
5539 if (mapFieldPartial.is_null()) {
5540 for(
int k = 0; k < mapGlobalInterfaceVecField->getNodeNumElements(); k++)
5543 dofGlobal = mapGlobalInterfaceVecField->getGlobalElement(k);
5544 dofLocal = mapInterfaceVecField->getGlobalElement(k);
5546 indices[0] = dofLocal;
5547 C_T->insertGlobalValues(dofGlobal, indices(), value());
5548 indices[0] = dofGlobal;
5549 C->insertGlobalValues(dofLocal, indices(), value());
5554 for(
int k = 0; k < mapGlobalInterfaceVecField->getNodeNumElements(); k++) {
5555 dofGlobal = mapGlobalInterfaceVecField->getGlobalElement(k);
5556 if ( mapFieldPartial->getLocalElement( dofGlobal ) != Teuchos::OrdinalTraits<LO>::invalid() ) {
5558 dofLocal = mapInterfaceVecField->getGlobalElement(k);
5560 indices[0] = dofLocal;
5561 C_T->insertGlobalValues(dofGlobal, indices(), value());
5562 indices[0] = dofGlobal;
5563 C->insertGlobalValues(dofLocal, indices(), value());
5568 if (callFillComplete)
5572 C_T->fillComplete(map1, map2);
5573 C->fillComplete(map2, map1);
5578template <
class SC,
class LO,
class GO,
class NO>
5579void FE<SC,LO,GO,NO>::assemblyGeometryCoupling(
int dim,
5583 MapConstPtr_Type map1,
5584 MapConstPtr_Type map2,
5585 MapConstPtr_Type map3,
5586 bool callFillComplete)
5589 DomainConstPtr_Type domain = domainVec_.at(FEloc);
5591 MapConstPtr_Type mapInt = domain->getGlobalInterfaceMapVecFieldUnique();
5592 MapConstPtr_Type mapOtherInt = domain->getOtherGlobalInterfaceMapVecFieldUnique();
5593 MapConstPtr_Type mapPartInt = domain->getGlobalInterfaceMapVecFieldPartial();
5594 MapConstPtr_Type mapOtherPartInt = domain->getOtherGlobalInterfaceMapVecFieldPartial();
5595 Teuchos::Array<SC> value( 1, 0. );
5597 Teuchos::Array<GO> indices( 1, 0 );
5600 if (mapPartInt.is_null()) {
5601 for(
int k = 0; k < mapInt->getNodeNumElements(); k++){
5602 dofRow = mapInt->getGlobalElement(k);
5603 indices[0] = mapOtherInt->getGlobalElement(k);
5604 C->insertGlobalValues(dofRow, indices(), value());
5608 for(
int k = 0; k < mapPartInt->getNodeNumElements(); k++){
5609 dofRow = mapPartInt->getGlobalElement(k);
5610 indices[0] = mapOtherPartInt->getGlobalElement(k);
5611 C->insertGlobalValues(dofRow, indices(), value());
5614 if (callFillComplete)
5617 C->fillComplete(map2, map3);
5622template <
class SC,
class LO,
class GO,
class NO>
5623void FE<SC,LO,GO,NO>::assemblyShapeDerivativeVelocity(
int dim,
5624 std::string FEType1,
5625 std::string FEType2,
5628 MultiVectorPtr_Type u,
5629 MultiVectorPtr_Type w,
5630 MultiVectorPtr_Type p,
5634 bool callFillComplete)
5638 DomainConstPtr_Type domain = domainVec_.at(FEloc);
5639 ElementsPtr_Type elements = domain->getElementsC();
5640 vec2D_dbl_ptr_Type pointsRep = domain->getPointsRepeated();
5641 MapConstPtr_Type map = domain->getMapRepeated();
5643 vec3D_dbl_ptr_Type dPhiU;
5644 vec2D_dbl_ptr_Type phiU;
5645 vec2D_dbl_ptr_Type phiP;
5646 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
5647 vec2D_dbl_ptr_Type quadPts;
5650 UN extraDeg = 2*Helper::determineDegree( dim, FEType1, Helper::Deriv1);
5651 UN deg = 2*Helper::determineDegree( dim, FEType1, Helper::Deriv0) + extraDeg;
5653 Helper::getDPhi(dPhiU, weights, dim, FEType1, deg);
5654 Helper::getPhi(phiU, weights, dim, FEType1, deg);
5655 Helper::getPhi(phiP, weights, dim, FEType2, deg);
5656 Helper::getQuadratureValues(dim, deg, quadPts, weights,FEType1);
5661 SmallMatrix<SC> B(dim);
5662 SmallMatrix<SC> Binv(dim);
5666 Teuchos::ArrayRCP< const SC > uArray = u->getData(0);
5667 Teuchos::ArrayRCP< const SC > wArray = w->getData(0);
5668 Teuchos::ArrayRCP< const SC > pArray = p->getData(0);
5672 double val11, val12, val21, val22;
5673 double valDK1_11, valDK1_12, valDK1_21, valDK1_22;
5674 double valDK2_11, valDK2_12, valDK2_21, valDK2_22;
5675 double valDN_11, valDN_12, valDN_21, valDN_22;
5676 double valDW_11, valDW_12, valDW_21, valDW_22;
5677 double valDP_11, valDP_12, valDP_21, valDP_22;
5678 double valDM_11, valDM_12, valDM_21, valDM_22;
5679 vec_dbl_Type p1(3,0.0), p2(3,0.0), p3(3,0.0);
5684 vec2D_dbl_Type u1Loc(1, vec_dbl_Type(weights->size(), -1.));
5685 vec2D_dbl_Type u2Loc(1, vec_dbl_Type(weights->size(), -1.));
5686 vec2D_dbl_Type w1Loc(1, vec_dbl_Type(weights->size(), -1.));
5687 vec2D_dbl_Type w2Loc(1, vec_dbl_Type(weights->size(), -1.));
5688 vec2D_dbl_Type pLoc(1, vec_dbl_Type(weights->size(), -1.));
5689 vec2D_dbl_Type u11(1, vec_dbl_Type(weights->size(), -1.));
5690 vec2D_dbl_Type u12(1, vec_dbl_Type(weights->size(), -1.));
5691 vec2D_dbl_Type u21(1, vec_dbl_Type(weights->size(), -1.));
5692 vec2D_dbl_Type u22(1, vec_dbl_Type(weights->size(), -1.));
5693 vec2D_dbl_Type w11(1, vec_dbl_Type(weights->size(), -1.));
5694 vec2D_dbl_Type w12(1, vec_dbl_Type(weights->size(), -1.));
5695 vec2D_dbl_Type w21(1, vec_dbl_Type(weights->size(), -1.));
5696 vec2D_dbl_Type w22(1, vec_dbl_Type(weights->size(), -1.));
5697 vec2D_dbl_Type sigma11(1, vec_dbl_Type(weights->size(), -1.));
5698 vec2D_dbl_Type sigma12(1, vec_dbl_Type(weights->size(), -1.));
5699 vec2D_dbl_Type sigma21(1, vec_dbl_Type(weights->size(), -1.));
5700 vec2D_dbl_Type sigma22(1, vec_dbl_Type(weights->size(), -1.));
5702 for (
int T = 0; T < elements->numberElements(); T++)
5704 p1 = pointsRep->at(elements->getElement(T).getNode(0));
5705 p2 = pointsRep->at(elements->getElement(T).getNode(1));
5706 p3 = pointsRep->at(elements->getElement(T).getNode(2));
5708 Helper::buildTransformation(elements->getElement(T).getVectorNodeList(), pointsRep, B);
5709 detB = B.computeInverse(Binv);
5710 absDetB = std::fabs(detB);
5713 vec3D_dbl_Type dPhiTransU( dPhiU->size(), vec2D_dbl_Type( dPhiU->at(0).size(), vec_dbl_Type(dim,0.) ) );
5714 applyBTinv( dPhiU, dPhiTransU, Binv );
5717 for(
int k = 0; k < phiU->size(); k++)
5723 for(
int i = 0; i < phiU->at(0).size(); i++)
5725 LO index1 = dim * elements->getElement(T).getNode(i) + 0;
5726 LO index2 = dim * elements->getElement(T).getNode(i) + 1;
5727 u1Loc[0][k] += uArray[index1] * phiU->at(k).at(i);
5728 u2Loc[0][k] += uArray[index2] * phiU->at(k).at(i);
5729 w1Loc[0][k] += wArray[index1] * phiU->at(k).at(i);
5730 w2Loc[0][k] += wArray[index2] * phiU->at(k).at(i);
5737 for(
int k = 0; k < phiP->size(); k++)
5740 for(
int i = 0; i < phiP->at(0).size(); i++)
5744 LO index = elements->getElement(T).getNode(i) + 0;
5745 pLoc[0][k] += pArray[index] * phiP->at(k).at(i);
5752 for(
int k = 0; k < dPhiTransU.size(); k++)
5762 for(
int i = 0; i < dPhiTransU[0].size(); i++)
5764 LO index1 = dim * elements->getElement(T).getNode(i) + 0;
5765 LO index2 = dim * elements->getElement(T).getNode(i) + 1;
5766 u11[0][k] += uArray[index1] * dPhiTransU[k][i][0];
5767 u12[0][k] += uArray[index1] * dPhiTransU[k][i][1];
5768 u21[0][k] += uArray[index2] * dPhiTransU[k][i][0];
5769 u22[0][k] += uArray[index2] * dPhiTransU[k][i][1];
5770 w11[0][k] += wArray[index1] * dPhiTransU[k][i][0];
5771 w12[0][k] += wArray[index1] * dPhiTransU[k][i][1];
5772 w21[0][k] += wArray[index2] * dPhiTransU[k][i][0];
5773 w22[0][k] += wArray[index2] * dPhiTransU[k][i][1];
5780 for(
int k = 0; k < dPhiTransU.size(); k++)
5782 sigma11[0][k] = rho * nu * (u11[0][k] + u11[0][k]) - pLoc[0][k];
5783 sigma12[0][k] = rho * nu * (u12[0][k] + u21[0][k]);
5784 sigma21[0][k] = rho * nu * (u21[0][k] + u12[0][k]);
5785 sigma22[0][k] = rho * nu * (u22[0][k] + u22[0][k]) - pLoc[0][k];
5789 for (
int i = 0; i < dPhiU->at(0).size(); i++)
5791 Teuchos::Array<SC> value11( 1, 0. );
5792 Teuchos::Array<SC> value12( 1, 0. );
5793 Teuchos::Array<SC> value21( 1, 0. );
5794 Teuchos::Array<SC> value22( 1, 0. );
5795 Teuchos::Array<GO> indices( 1, 0 );
5797 for (
int j = 0; j < dPhiU->at(0).size(); j++)
5835 for (
int k = 0; k < dPhiU->size(); k++)
5838 valDK1_11 = valDK1_11 + weights->at(k) *
5839 ( 2 * u11[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][0] +
5840 u11[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][1] +
5841 u21[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][1] );
5842 valDK1_12 = valDK1_12 + weights->at(k) *
5843 ( 2 * u12[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][0] +
5844 u12[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][1] +
5845 u22[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][1] );
5846 valDK1_21 = valDK1_21 + weights->at(k) *
5847 ( u11[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][0] +
5848 u21[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][0] +
5849 2 * u21[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][1] );
5850 valDK1_22 = valDK1_22 + weights->at(k) *
5851 ( u12[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][0] +
5852 u22[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][0] +
5853 2 * u22[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][1] );
5856 valDK2_11 = valDK2_11 + weights->at(k) *
5857 ( -sigma12[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][0] +
5858 sigma12[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][1] );
5859 valDK2_12 = valDK2_12 + weights->at(k) *
5860 ( sigma11[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][0] +
5861 -sigma11[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][1] );
5862 valDK2_21 = valDK2_21 + weights->at(k) *
5863 ( -sigma22[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][0] +
5864 sigma22[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][1] );
5865 valDK2_22 = valDK2_22 + weights->at(k) *
5866 ( sigma21[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][0] +
5867 -sigma21[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][1] );
5870 valDN_11 = valDN_11 + weights->at(k) *
5871 ( -(u2Loc[0][k] - w2Loc[0][k]) * dPhiTransU[k][j][1] * u11[0][k] * phiU->at(k).at(i) +
5872 (u2Loc[0][k] - w2Loc[0][k]) * dPhiTransU[k][j][0] * u12[0][k] * phiU->at(k).at(i) );
5873 valDN_12 = valDN_12 + weights->at(k) *
5874 ( (u1Loc[0][k] - w1Loc[0][k]) * dPhiTransU[k][j][1] * u11[0][k] * phiU->at(k).at(i) -
5875 (u1Loc[0][k] - w1Loc[0][k]) * dPhiTransU[k][j][0] * u12[0][k] * phiU->at(k).at(i) );
5876 valDN_21 = valDN_21 + weights->at(k) *
5877 ( -(u2Loc[0][k] - w2Loc[0][k]) * dPhiTransU[k][j][1] * u21[0][k] * phiU->at(k).at(i) +
5878 (u2Loc[0][k] - w2Loc[0][k]) * dPhiTransU[k][j][0] * u22[0][k] * phiU->at(k).at(i) );
5879 valDN_22 = valDN_22 + weights->at(k) *
5880 ( (u1Loc[0][k] - w1Loc[0][k]) * dPhiTransU[k][j][1] * u21[0][k] * phiU->at(k).at(i) -
5881 (u1Loc[0][k] - w1Loc[0][k]) * dPhiTransU[k][j][0] * u22[0][k] * phiU->at(k).at(i) );
5884 valDW_11 = valDW_11 + weights->at(k) *
5885 ( u11[0][k] * phiU->at(k).at(j) * phiU->at(k).at(i) );
5886 valDW_12 = valDW_12 + weights->at(k) *
5887 ( u12[0][k] * phiU->at(k).at(j) * phiU->at(k).at(i) );
5888 valDW_21 = valDW_21 + weights->at(k) *
5889 ( u21[0][k] * phiU->at(k).at(j) * phiU->at(k).at(i) );
5890 valDW_22 = valDW_22 + weights->at(k) *
5891 ( u22[0][k] * phiU->at(k).at(j) * phiU->at(k).at(i) );
5894 valDP_11 = valDP_11 + weights->at(k) *
5895 ( ( -w21[0][k] * dPhiTransU[k][j][1] + w22[0][k] * dPhiTransU[k][j][0] ) * u1Loc[0][k] * phiU->at(k).at(i) );
5896 valDP_12 = valDP_12 + weights->at(k) *
5897 ( ( w11[0][k] * dPhiTransU[k][j][1] - w12[0][k] * dPhiTransU[k][j][0] ) * u1Loc[0][k] * phiU->at(k).at(i) );
5898 valDP_21 = valDP_21 + weights->at(k) *
5899 ( ( -w21[0][k] * dPhiTransU[k][j][1] + w22[0][k] * dPhiTransU[k][j][0] ) * u2Loc[0][k] * phiU->at(k).at(i) );
5900 valDP_22 = valDP_22 + weights->at(k) *
5901 ( ( w11[0][k] * dPhiTransU[k][j][1] - w12[0][k] * dPhiTransU[k][j][0] ) * u2Loc[0][k] * phiU->at(k).at(i) );
5904 valDM_11 = valDM_11 + weights->at(k) *
5905 ( dPhiTransU[k][j][0] * u1Loc[0][k] * phiU->at(k).at(i) );
5906 valDM_12 = valDM_12 + weights->at(k) *
5907 ( dPhiTransU[k][j][1] * u1Loc[0][k] * phiU->at(k).at(i) );
5908 valDM_21 = valDM_21 + weights->at(k) *
5909 ( dPhiTransU[k][j][0] * u2Loc[0][k] * phiU->at(k).at(i) );
5910 valDM_22 = valDM_22 + weights->at(k) *
5911 ( dPhiTransU[k][j][1] * u2Loc[0][k] * phiU->at(k).at(i) );
5914 val11 = -rho*nu*valDK1_11 + valDK2_11 + rho*valDN_11 - rho*valDP_11 - (1.0/dt)*rho*valDW_11 + (0.5/dt)*rho*valDM_11;
5915 val12 = -rho*nu*valDK1_12 + valDK2_12 + rho*valDN_12 - rho*valDP_12 - (1.0/dt)*rho*valDW_12 + (0.5/dt)*rho*valDM_12;
5916 val21 = -rho*nu*valDK1_21 + valDK2_21 + rho*valDN_21 - rho*valDP_21 - (1.0/dt)*rho*valDW_21 + (0.5/dt)*rho*valDM_21;
5917 val22 = -rho*nu*valDK1_22 + valDK2_22 + rho*valDN_22 - rho*valDP_22 - (1.0/dt)*rho*valDW_22 + (0.5/dt)*rho*valDM_22;
5919 val11 = absDetB * val11;
5920 val12 = absDetB * val12;
5921 val21 = absDetB * val21;
5922 val22 = absDetB * val22;
5929 glob_j = dim * map->getGlobalElement(elements->getElement(T).getNode(j));
5930 glob_i = dim * map->getGlobalElement(elements->getElement(T).getNode(i));
5931 indices[0] = glob_j;
5933 D->insertGlobalValues(glob_i, indices(), value11());
5934 D->insertGlobalValues(glob_i+1, indices(), value21());
5936 indices[0] = glob_j;
5937 D->insertGlobalValues(glob_i, indices(), value12());
5938 D->insertGlobalValues(glob_i+1, indices(), value22());
5942 if (callFillComplete)
5949 double val11, val12, val13, val21, val22, val23, val31, val32, val33;
5950 double valDK1_11, valDK1_12, valDK1_13, valDK1_21, valDK1_22, valDK1_23, valDK1_31, valDK1_32, valDK1_33;
5951 double valDK2_11, valDK2_12, valDK2_13, valDK2_21, valDK2_22, valDK2_23, valDK2_31, valDK2_32, valDK2_33;
5952 double valDN_11, valDN_12, valDN_13, valDN_21, valDN_22, valDN_23, valDN_31, valDN_32, valDN_33;
5953 double valDW_11, valDW_12, valDW_13, valDW_21, valDW_22, valDW_23, valDW_31, valDW_32, valDW_33;
5954 double valDP_11, valDP_12, valDP_13, valDP_21, valDP_22, valDP_23, valDP_31, valDP_32, valDP_33;
5955 double valDM_11, valDM_12, valDM_13, valDM_21, valDM_22, valDM_23, valDM_31, valDM_32, valDM_33;
5956 vec_dbl_Type p1(3,0.0), p2(3,0.0), p3(3,0.0), p4(3,0.0);
5961 vec2D_dbl_Type u1Loc(1, vec_dbl_Type(weights->size(), -1.));
5962 vec2D_dbl_Type u2Loc(1, vec_dbl_Type(weights->size(), -1.));
5963 vec2D_dbl_Type u3Loc(1, vec_dbl_Type(weights->size(), -1.));
5964 vec2D_dbl_Type w1Loc(1, vec_dbl_Type(weights->size(), -1.));
5965 vec2D_dbl_Type w2Loc(1, vec_dbl_Type(weights->size(), -1.));
5966 vec2D_dbl_Type w3Loc(1, vec_dbl_Type(weights->size(), -1.));
5967 vec2D_dbl_Type pLoc(1, vec_dbl_Type(weights->size(), -1.));
5968 vec2D_dbl_Type u11(1, vec_dbl_Type(weights->size(), -1.));
5969 vec2D_dbl_Type u12(1, vec_dbl_Type(weights->size(), -1.));
5970 vec2D_dbl_Type u13(1, vec_dbl_Type(weights->size(), -1.));
5971 vec2D_dbl_Type u21(1, vec_dbl_Type(weights->size(), -1.));
5972 vec2D_dbl_Type u22(1, vec_dbl_Type(weights->size(), -1.));
5973 vec2D_dbl_Type u23(1, vec_dbl_Type(weights->size(), -1.));
5974 vec2D_dbl_Type u31(1, vec_dbl_Type(weights->size(), -1.));
5975 vec2D_dbl_Type u32(1, vec_dbl_Type(weights->size(), -1.));
5976 vec2D_dbl_Type u33(1, vec_dbl_Type(weights->size(), -1.));
5977 vec2D_dbl_Type w11(1, vec_dbl_Type(weights->size(), -1.));
5978 vec2D_dbl_Type w12(1, vec_dbl_Type(weights->size(), -1.));
5979 vec2D_dbl_Type w13(1, vec_dbl_Type(weights->size(), -1.));
5980 vec2D_dbl_Type w21(1, vec_dbl_Type(weights->size(), -1.));
5981 vec2D_dbl_Type w22(1, vec_dbl_Type(weights->size(), -1.));
5982 vec2D_dbl_Type w23(1, vec_dbl_Type(weights->size(), -1.));
5983 vec2D_dbl_Type w31(1, vec_dbl_Type(weights->size(), -1.));
5984 vec2D_dbl_Type w32(1, vec_dbl_Type(weights->size(), -1.));
5985 vec2D_dbl_Type w33(1, vec_dbl_Type(weights->size(), -1.));
5986 vec2D_dbl_Type sigma11(1, vec_dbl_Type(weights->size(), -1.));
5987 vec2D_dbl_Type sigma12(1, vec_dbl_Type(weights->size(), -1.));
5988 vec2D_dbl_Type sigma13(1, vec_dbl_Type(weights->size(), -1.));
5989 vec2D_dbl_Type sigma21(1, vec_dbl_Type(weights->size(), -1.));
5990 vec2D_dbl_Type sigma22(1, vec_dbl_Type(weights->size(), -1.));
5991 vec2D_dbl_Type sigma23(1, vec_dbl_Type(weights->size(), -1.));
5992 vec2D_dbl_Type sigma31(1, vec_dbl_Type(weights->size(), -1.));
5993 vec2D_dbl_Type sigma32(1, vec_dbl_Type(weights->size(), -1.));
5994 vec2D_dbl_Type sigma33(1, vec_dbl_Type(weights->size(), -1.));
5996 for (
int T = 0; T < elements->numberElements(); T++)
5998 p1 = pointsRep->at(elements->getElement(T).getNode(0));
5999 p2 = pointsRep->at(elements->getElement(T).getNode(1));
6000 p3 = pointsRep->at(elements->getElement(T).getNode(2));
6001 p4 = pointsRep->at(elements->getElement(T).getNode(3));
6003 Helper::buildTransformation(elements->getElement(T).getVectorNodeList(), pointsRep, B);
6004 detB = B.computeInverse(Binv);
6005 absDetB = std::fabs(detB);
6008 vec3D_dbl_Type dPhiTransU( dPhiU->size(), vec2D_dbl_Type( dPhiU->at(0).size(), vec_dbl_Type(dim,0.) ) );
6009 applyBTinv( dPhiU, dPhiTransU, Binv );
6012 for(
int k = 0; k < phiU->size(); k++)
6020 for(
int i = 0; i < phiU->at(0).size(); i++)
6022 LO index1 = dim * elements->getElement(T).getNode(i) + 0;
6023 LO index2 = dim * elements->getElement(T).getNode(i) + 1;
6024 LO index3 = dim * elements->getElement(T).getNode(i) + 2;
6025 u1Loc[0][k] += uArray[index1] * phiU->at(k).at(i);
6026 u2Loc[0][k] += uArray[index2] * phiU->at(k).at(i);
6027 u3Loc[0][k] += uArray[index3] * phiU->at(k).at(i);
6028 w1Loc[0][k] += wArray[index1] * phiU->at(k).at(i);
6029 w2Loc[0][k] += wArray[index2] * phiU->at(k).at(i);
6030 w3Loc[0][k] += wArray[index3] * phiU->at(k).at(i);
6036 for(
int k = 0; k < phiP->size(); k++)
6039 for(
int i = 0; i < phiP->at(0).size(); i++)
6042 LO index = elements->getElement(T).getNode(i) + 0;
6043 pLoc[0][k] += pArray[index] * phiP->at(k).at(i);
6049 for(
int k = 0; k < dPhiTransU.size(); k++)
6069 for(
int i = 0; i < dPhiTransU[0].size(); i++)
6071 LO index1 = dim * elements->getElement(T).getNode(i) + 0;
6072 LO index2 = dim * elements->getElement(T).getNode(i) + 1;
6073 LO index3 = dim * elements->getElement(T).getNode(i) + 2;
6074 u11[0][k] += uArray[index1] * dPhiTransU[k][i][0];
6075 u12[0][k] += uArray[index1] * dPhiTransU[k][i][1];
6076 u13[0][k] += uArray[index1] * dPhiTransU[k][i][2];
6077 u21[0][k] += uArray[index2] * dPhiTransU[k][i][0];
6078 u22[0][k] += uArray[index2] * dPhiTransU[k][i][1];
6079 u23[0][k] += uArray[index2] * dPhiTransU[k][i][2];
6080 u31[0][k] += uArray[index3] * dPhiTransU[k][i][0];
6081 u32[0][k] += uArray[index3] * dPhiTransU[k][i][1];
6082 u33[0][k] += uArray[index3] * dPhiTransU[k][i][2];
6083 w11[0][k] += wArray[index1] * dPhiTransU[k][i][0];
6084 w12[0][k] += wArray[index1] * dPhiTransU[k][i][1];
6085 w13[0][k] += wArray[index1] * dPhiTransU[k][i][2];
6086 w21[0][k] += wArray[index2] * dPhiTransU[k][i][0];
6087 w22[0][k] += wArray[index2] * dPhiTransU[k][i][1];
6088 w23[0][k] += wArray[index2] * dPhiTransU[k][i][2];
6089 w31[0][k] += wArray[index3] * dPhiTransU[k][i][0];
6090 w32[0][k] += wArray[index3] * dPhiTransU[k][i][1];
6091 w33[0][k] += wArray[index3] * dPhiTransU[k][i][2];
6097 for(
int k = 0; k < dPhiTransU.size(); k++)
6099 sigma11[0][k] = rho * nu * (u11[0][k] + u11[0][k]) - pLoc[0][k];
6100 sigma12[0][k] = rho * nu * (u12[0][k] + u21[0][k]);
6101 sigma13[0][k] = rho * nu * (u13[0][k] + u31[0][k]);
6102 sigma21[0][k] = rho * nu * (u21[0][k] + u12[0][k]);
6103 sigma22[0][k] = rho * nu * (u22[0][k] + u22[0][k]) - pLoc[0][k];
6104 sigma23[0][k] = rho * nu * (u23[0][k] + u32[0][k]);
6105 sigma31[0][k] = rho * nu * (u31[0][k] + u13[0][k]);
6106 sigma32[0][k] = rho * nu * (u32[0][k] + u23[0][k]);
6107 sigma33[0][k] = rho * nu * (u33[0][k] + u33[0][k]) - pLoc[0][k];
6111 for (
int i = 0; i < dPhiU->at(0).size(); i++)
6113 Teuchos::Array<SC> value11( 1, 0. );
6114 Teuchos::Array<SC> value12( 1, 0. );
6115 Teuchos::Array<SC> value13( 1, 0. );
6116 Teuchos::Array<SC> value21( 1, 0. );
6117 Teuchos::Array<SC> value22( 1, 0. );
6118 Teuchos::Array<SC> value23( 1, 0. );
6119 Teuchos::Array<SC> value31( 1, 0. );
6120 Teuchos::Array<SC> value32( 1, 0. );
6121 Teuchos::Array<SC> value33( 1, 0. );
6122 Teuchos::Array<GO> indices( 1, 0 );
6124 for (
int j = 0; j < dPhiU->at(0).size(); j++)
6192 for (
int k = 0; k < dPhiU->size(); k++)
6195 valDK1_11 = valDK1_11 + weights->at(k) *
6196 ( 2 * u11[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][0] +
6197 ( u11[0][k] * dPhiTransU[k][j][1] + u21[0][k] * dPhiTransU[k][j][0] ) * dPhiTransU[k][i][1] +
6198 ( u11[0][k] * dPhiTransU[k][j][2] + u31[0][k] * dPhiTransU[k][j][0] ) * dPhiTransU[k][i][2] );
6199 valDK1_12 = valDK1_12 + weights->at(k) *
6200 ( 2 * u12[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][0] +
6201 ( u12[0][k] * dPhiTransU[k][j][1] + u22[0][k] * dPhiTransU[k][j][0] ) * dPhiTransU[k][i][1] +
6202 ( u12[0][k] * dPhiTransU[k][j][2] + u32[0][k] * dPhiTransU[k][j][0] ) * dPhiTransU[k][i][2] );
6203 valDK1_13 = valDK1_13 + weights->at(k) *
6204 ( 2 * u13[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][0] +
6205 ( u13[0][k] * dPhiTransU[k][j][1] + u23[0][k] * dPhiTransU[k][j][0] ) * dPhiTransU[k][i][1] +
6206 ( u13[0][k] * dPhiTransU[k][j][2] + u33[0][k] * dPhiTransU[k][j][0] ) * dPhiTransU[k][i][2] );
6207 valDK1_21 = valDK1_21 + weights->at(k) *
6208 ( ( u21[0][k] * dPhiTransU[k][j][0] + u11[0][k] * dPhiTransU[k][j][1] ) * dPhiTransU[k][i][0] +
6209 2 * u21[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][1] +
6210 ( u21[0][k] * dPhiTransU[k][j][2] + u31[0][k] * dPhiTransU[k][j][1] ) * dPhiTransU[k][i][2] );
6211 valDK1_22 = valDK1_22 + weights->at(k) *
6212 ( ( u22[0][k] * dPhiTransU[k][j][0] + u12[0][k] * dPhiTransU[k][j][1] ) * dPhiTransU[k][i][0] +
6213 2 * u22[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][1] +
6214 ( u22[0][k] * dPhiTransU[k][j][2] + u32[0][k] * dPhiTransU[k][j][1] ) * dPhiTransU[k][i][2] );
6215 valDK1_23 = valDK1_23 + weights->at(k) *
6216 ( ( u23[0][k] * dPhiTransU[k][j][0] + u13[0][k] * dPhiTransU[k][j][1] ) * dPhiTransU[k][i][0] +
6217 2 * u23[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][1] +
6218 ( u23[0][k] * dPhiTransU[k][j][2] + u33[0][k] * dPhiTransU[k][j][1] ) * dPhiTransU[k][i][2] );
6219 valDK1_31 = valDK1_31 + weights->at(k) *
6220 ( ( u31[0][k] * dPhiTransU[k][j][0] + u11[0][k] * dPhiTransU[k][j][2] ) * dPhiTransU[k][i][0] +
6221 ( u31[0][k] * dPhiTransU[k][j][1] + u21[0][k] * dPhiTransU[k][j][2] ) * dPhiTransU[k][i][1] ) +
6222 2 * u31[0][k] * dPhiTransU[k][j][2] * dPhiTransU[k][i][2];
6223 valDK1_32 = valDK1_32 + weights->at(k) *
6224 ( ( u32[0][k] * dPhiTransU[k][j][0] + u12[0][k] * dPhiTransU[k][j][2] ) * dPhiTransU[k][i][0] +
6225 ( u32[0][k] * dPhiTransU[k][j][1] + u22[0][k] * dPhiTransU[k][j][2] ) * dPhiTransU[k][i][1] ) +
6226 2 * u32[0][k] * dPhiTransU[k][j][2] * dPhiTransU[k][i][2];
6227 valDK1_33 = valDK1_33 + weights->at(k) *
6228 ( ( u33[0][k] * dPhiTransU[k][j][0] + u13[0][k] * dPhiTransU[k][j][2] ) * dPhiTransU[k][i][0] +
6229 ( u33[0][k] * dPhiTransU[k][j][1] + u23[0][k] * dPhiTransU[k][j][2] ) * dPhiTransU[k][i][1] ) +
6230 2 * u33[0][k] * dPhiTransU[k][j][2] * dPhiTransU[k][i][2];
6233 valDK2_11 = valDK2_11 + weights->at(k) *
6234 ( ( -sigma12[0][k] * dPhiTransU[k][j][1] - sigma13[0][k] * dPhiTransU[k][j][2] ) * dPhiTransU[k][i][0] +
6235 sigma12[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][1] +
6236 sigma13[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][2] );
6237 valDK2_12 = valDK2_12 + weights->at(k) *
6238 ( sigma11[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][0] +
6239 ( -sigma11[0][k] * dPhiTransU[k][j][0] - sigma13[0][k] * dPhiTransU[k][j][2] ) * dPhiTransU[k][i][1] +
6240 sigma13[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][2] );
6241 valDK2_13 = valDK2_13 + weights->at(k) *
6242 ( sigma11[0][k] * dPhiTransU[k][j][2] * dPhiTransU[k][i][0] +
6243 sigma12[0][k] * dPhiTransU[k][j][2] * dPhiTransU[k][i][1] +
6244 ( -sigma11[0][k] * dPhiTransU[k][j][0] - sigma12[0][k] * dPhiTransU[k][j][1] ) * dPhiTransU[k][i][2] );
6245 valDK2_21 = valDK2_21 + weights->at(k) *
6246 ( ( -sigma22[0][k] * dPhiTransU[k][j][1] - sigma23[0][k] * dPhiTransU[k][j][2] ) * dPhiTransU[k][i][0] +
6247 sigma22[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][1] +
6248 sigma23[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][2] );
6249 valDK2_22 = valDK2_22 + weights->at(k) *
6250 ( sigma21[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][0] +
6251 ( -sigma21[0][k] * dPhiTransU[k][j][0] - sigma23[0][k] * dPhiTransU[k][j][2] ) * dPhiTransU[k][i][1] +
6252 sigma23[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][2] );
6253 valDK2_23 = valDK2_23 + weights->at(k) *
6254 ( sigma21[0][k] * dPhiTransU[k][j][2] * dPhiTransU[k][i][0] +
6255 sigma22[0][k] * dPhiTransU[k][j][2] * dPhiTransU[k][i][1] +
6256 ( -sigma21[0][k] * dPhiTransU[k][j][0] - sigma22[0][k] * dPhiTransU[k][j][1] ) * dPhiTransU[k][i][2] );
6257 valDK2_31 = valDK2_31 + weights->at(k) *
6258 ( ( -sigma32[0][k] * dPhiTransU[k][j][1] - sigma33[0][k] * dPhiTransU[k][j][2] ) * dPhiTransU[k][i][0] +
6259 sigma32[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][1] +
6260 sigma33[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][2] );
6261 valDK2_32 = valDK2_32 + weights->at(k) *
6262 ( sigma31[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][0] +
6263 ( -sigma31[0][k] * dPhiTransU[k][j][0] - sigma33[0][k] * dPhiTransU[k][j][2] ) * dPhiTransU[k][i][1] +
6264 sigma33[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][2] );
6265 valDK2_33 = valDK2_33 + weights->at(k) *
6266 ( sigma31[0][k] * dPhiTransU[k][j][2] * dPhiTransU[k][i][0] +
6267 sigma32[0][k] * dPhiTransU[k][j][2] * dPhiTransU[k][i][1] +
6268 ( -sigma31[0][k] * dPhiTransU[k][j][0] - sigma32[0][k] * dPhiTransU[k][j][1] ) * dPhiTransU[k][i][2] );
6280 ZN_11 = - ( u2Loc[0][k] - w2Loc[0][k] ) * dPhiTransU[k][j][1] - ( u3Loc[0][k] - w3Loc[0][k] ) * dPhiTransU[k][j][2];
6281 ZN_12 = ( u2Loc[0][k] - w2Loc[0][k] ) * dPhiTransU[k][j][0];
6282 ZN_13 = ( u3Loc[0][k] - w3Loc[0][k] ) * dPhiTransU[k][j][0];
6283 ZN_21 = ( u1Loc[0][k] - w1Loc[0][k] ) * dPhiTransU[k][j][1];
6284 ZN_22 = - ( u1Loc[0][k] - w1Loc[0][k] ) * dPhiTransU[k][j][0] - ( u3Loc[0][k] - w3Loc[0][k] ) * dPhiTransU[k][j][2];
6285 ZN_23 = ( u3Loc[0][k] - w3Loc[0][k] ) * dPhiTransU[k][j][1];
6286 ZN_31 = ( u1Loc[0][k] - w1Loc[0][k] ) * dPhiTransU[k][j][2];
6287 ZN_32 = ( u2Loc[0][k] - w2Loc[0][k] ) * dPhiTransU[k][j][2];
6288 ZN_33 = - ( u1Loc[0][k] - w1Loc[0][k] ) * dPhiTransU[k][j][0] - ( u2Loc[0][k] - w2Loc[0][k] ) * dPhiTransU[k][j][1];
6290 valDN_11 = valDN_11 + weights->at(k) *
6291 ( ZN_11 * u11[0][k] * phiU->at(k).at(i) +
6292 ZN_12 * u12[0][k] * phiU->at(k).at(i) +
6293 ZN_13 * u13[0][k] * phiU->at(k).at(i) );
6294 valDN_12 = valDN_12 + weights->at(k) *
6295 ( ZN_21 * u11[0][k] * phiU->at(k).at(i) +
6296 ZN_22 * u12[0][k] * phiU->at(k).at(i) +
6297 ZN_23 * u13[0][k] * phiU->at(k).at(i) );
6298 valDN_13 = valDN_13 + weights->at(k) *
6299 ( ZN_31 * u11[0][k] * phiU->at(k).at(i) +
6300 ZN_32 * u12[0][k] * phiU->at(k).at(i) +
6301 ZN_33 * u13[0][k] * phiU->at(k).at(i) );
6302 valDN_21 = valDN_21 + weights->at(k) *
6303 ( ZN_11 * u21[0][k] * phiU->at(k).at(i) +
6304 ZN_12 * u22[0][k] * phiU->at(k).at(i) +
6305 ZN_13 * u23[0][k] * phiU->at(k).at(i) );
6306 valDN_22 = valDN_22 + weights->at(k) *
6307 ( ZN_21 * u21[0][k] * phiU->at(k).at(i) +
6308 ZN_22 * u22[0][k] * phiU->at(k).at(i) +
6309 ZN_23 * u23[0][k] * phiU->at(k).at(i) );
6310 valDN_23 = valDN_23 + weights->at(k) *
6311 ( ZN_31 * u21[0][k] * phiU->at(k).at(i) +
6312 ZN_32 * u22[0][k] * phiU->at(k).at(i) +
6313 ZN_33 * u23[0][k] * phiU->at(k).at(i) );
6314 valDN_31 = valDN_31 + weights->at(k) *
6315 ( ZN_11 * u31[0][k] * phiU->at(k).at(i) +
6316 ZN_12 * u32[0][k] * phiU->at(k).at(i) +
6317 ZN_13 * u33[0][k] * phiU->at(k).at(i) );
6318 valDN_32 = valDN_32 + weights->at(k) *
6319 ( ZN_21 * u31[0][k] * phiU->at(k).at(i) +
6320 ZN_22 * u32[0][k] * phiU->at(k).at(i) +
6321 ZN_23 * u33[0][k] * phiU->at(k).at(i) );
6322 valDN_33 = valDN_33 + weights->at(k) *
6323 ( ZN_31 * u31[0][k] * phiU->at(k).at(i) +
6324 ZN_32 * u32[0][k] * phiU->at(k).at(i) +
6325 ZN_33 * u33[0][k] * phiU->at(k).at(i) );
6328 valDW_11 = valDW_11 + weights->at(k) *
6329 ( u11[0][k] * phiU->at(k).at(j) * phiU->at(k).at(i) );
6330 valDW_12 = valDW_12 + weights->at(k) *
6331 ( u12[0][k] * phiU->at(k).at(j) * phiU->at(k).at(i) );
6332 valDW_13 = valDW_13 + weights->at(k) *
6333 ( u13[0][k] * phiU->at(k).at(j) * phiU->at(k).at(i) );
6334 valDW_21 = valDW_21 + weights->at(k) *
6335 ( u21[0][k] * phiU->at(k).at(j) * phiU->at(k).at(i) );
6336 valDW_22 = valDW_22 + weights->at(k) *
6337 ( u22[0][k] * phiU->at(k).at(j) * phiU->at(k).at(i) );
6338 valDW_23 = valDW_23 + weights->at(k) *
6339 ( u23[0][k] * phiU->at(k).at(j) * phiU->at(k).at(i) );
6340 valDW_31 = valDW_31 + weights->at(k) *
6341 ( u31[0][k] * phiU->at(k).at(j) * phiU->at(k).at(i) );
6342 valDW_32 = valDW_32 + weights->at(k) *
6343 ( u32[0][k] * phiU->at(k).at(j) * phiU->at(k).at(i) );
6344 valDW_33 = valDW_33 + weights->at(k) *
6345 ( u33[0][k] * phiU->at(k).at(j) * phiU->at(k).at(i) );
6351 ZP_1 = -w21[0][k] * dPhiTransU[k][j][1] + w22[0][k] * dPhiTransU[k][j][0] -
6352 w31[0][k] * dPhiTransU[k][j][2] + w33[0][k] * dPhiTransU[k][j][0];
6353 ZP_2 = w11[0][k] * dPhiTransU[k][j][1] - w12[0][k] * dPhiTransU[k][j][0] -
6354 w32[0][k] * dPhiTransU[k][j][2] + w33[0][k] * dPhiTransU[k][j][1];
6355 ZP_3 = w11[0][k] * dPhiTransU[k][j][2] - w13[0][k] * dPhiTransU[k][j][0] +
6356 w22[0][k] * dPhiTransU[k][j][2] - w23[0][k] * dPhiTransU[k][j][1];
6358 valDP_11 = valDP_11 + weights->at(k) *
6359 ( ZP_1 * u1Loc[0][k] * phiU->at(k).at(i) );
6360 valDP_12 = valDP_12 + weights->at(k) *
6361 ( ZP_2 * u1Loc[0][k] * phiU->at(k).at(i) );
6362 valDP_13 = valDP_13 + weights->at(k) *
6363 ( ZP_3 * u1Loc[0][k] * phiU->at(k).at(i) );
6364 valDP_21 = valDP_21 + weights->at(k) *
6365 ( ZP_1 * u2Loc[0][k] * phiU->at(k).at(i) );
6366 valDP_22 = valDP_22 + weights->at(k) *
6367 ( ZP_2 * u2Loc[0][k] * phiU->at(k).at(i) );
6368 valDP_23 = valDP_23 + weights->at(k) *
6369 ( ZP_3 * u2Loc[0][k] * phiU->at(k).at(i) );
6370 valDP_31 = valDP_31 + weights->at(k) *
6371 ( ZP_1 * u3Loc[0][k] * phiU->at(k).at(i) );
6372 valDP_32 = valDP_32 + weights->at(k) *
6373 ( ZP_2 * u3Loc[0][k] * phiU->at(k).at(i) );
6374 valDP_33 = valDP_33 + weights->at(k) *
6375 ( ZP_3 * u3Loc[0][k] * phiU->at(k).at(i) );
6378 valDM_11 = valDM_11 + weights->at(k) *
6379 ( dPhiTransU[k][j][0] * u1Loc[0][k] * phiU->at(k).at(i) );
6380 valDM_12 = valDM_12 + weights->at(k) *
6381 ( dPhiTransU[k][j][1] * u1Loc[0][k] * phiU->at(k).at(i) );
6382 valDM_13 = valDM_13 + weights->at(k) *
6383 ( dPhiTransU[k][j][2] * u1Loc[0][k] * phiU->at(k).at(i) );
6384 valDM_21 = valDM_21 + weights->at(k) *
6385 ( dPhiTransU[k][j][0] * u2Loc[0][k] * phiU->at(k).at(i) );
6386 valDM_22 = valDM_22 + weights->at(k) *
6387 ( dPhiTransU[k][j][1] * u2Loc[0][k] * phiU->at(k).at(i) );
6388 valDM_23 = valDM_23 + weights->at(k) *
6389 ( dPhiTransU[k][j][2] * u2Loc[0][k] * phiU->at(k).at(i) );
6390 valDM_31 = valDM_31 + weights->at(k) *
6391 ( dPhiTransU[k][j][0] * u3Loc[0][k] * phiU->at(k).at(i) );
6392 valDM_32 = valDM_32 + weights->at(k) *
6393 ( dPhiTransU[k][j][1] * u3Loc[0][k] * phiU->at(k).at(i) );
6394 valDM_33 = valDM_33 + weights->at(k) *
6395 ( dPhiTransU[k][j][2] * u3Loc[0][k] * phiU->at(k).at(i) );
6398 val11 = -rho*nu*valDK1_11 + valDK2_11 + rho*valDN_11 - rho*valDP_11 - (1.0/dt)*rho*valDW_11 + (0.5/dt)*rho*valDM_11;
6399 val12 = -rho*nu*valDK1_12 + valDK2_12 + rho*valDN_12 - rho*valDP_12 - (1.0/dt)*rho*valDW_12 + (0.5/dt)*rho*valDM_12;
6400 val13 = -rho*nu*valDK1_13 + valDK2_13 + rho*valDN_13 - rho*valDP_13 - (1.0/dt)*rho*valDW_13 + (0.5/dt)*rho*valDM_13;
6401 val21 = -rho*nu*valDK1_21 + valDK2_21 + rho*valDN_21 - rho*valDP_21 - (1.0/dt)*rho*valDW_21 + (0.5/dt)*rho*valDM_21;
6402 val22 = -rho*nu*valDK1_22 + valDK2_22 + rho*valDN_22 - rho*valDP_22 - (1.0/dt)*rho*valDW_22 + (0.5/dt)*rho*valDM_22;
6403 val23 = -rho*nu*valDK1_23 + valDK2_23 + rho*valDN_23 - rho*valDP_23 - (1.0/dt)*rho*valDW_23 + (0.5/dt)*rho*valDM_23;
6404 val31 = -rho*nu*valDK1_31 + valDK2_31 + rho*valDN_31 - rho*valDP_31 - (1.0/dt)*rho*valDW_31 + (0.5/dt)*rho*valDM_31;
6405 val32 = -rho*nu*valDK1_32 + valDK2_32 + rho*valDN_32 - rho*valDP_32 - (1.0/dt)*rho*valDW_32 + (0.5/dt)*rho*valDM_32;
6406 val33 = -rho*nu*valDK1_33 + valDK2_33 + rho*valDN_33 - rho*valDP_33 - (1.0/dt)*rho*valDW_33 + (0.5/dt)*rho*valDM_33;
6408 val11 = absDetB * val11;
6409 val12 = absDetB * val12;
6410 val13 = absDetB * val13;
6411 val21 = absDetB * val21;
6412 val22 = absDetB * val22;
6413 val23 = absDetB * val23;
6414 val31 = absDetB * val31;
6415 val32 = absDetB * val32;
6416 val33 = absDetB * val33;
6429 glob_j = dim * map->getGlobalElement(elements->getElement(T).getNode(j));
6430 glob_i = dim * map->getGlobalElement(elements->getElement(T).getNode(i));
6431 indices[0] = glob_j;
6433 D->insertGlobalValues(glob_i, indices(), value11());
6434 D->insertGlobalValues(glob_i+1, indices(), value21());
6435 D->insertGlobalValues(glob_i+2, indices(), value31());
6437 indices[0] = glob_j;
6438 D->insertGlobalValues(glob_i, indices(), value12());
6439 D->insertGlobalValues(glob_i+1, indices(), value22());
6440 D->insertGlobalValues(glob_i+2, indices(), value32());
6442 indices[0] = glob_j;
6443 D->insertGlobalValues(glob_i, indices(), value13());
6444 D->insertGlobalValues(glob_i+1, indices(), value23());
6445 D->insertGlobalValues(glob_i+2, indices(), value33());
6449 if (callFillComplete)
6458template <
class SC,
class LO,
class GO,
class NO>
6459void FE<SC,LO,GO,NO>::assemblyShapeDerivativeDivergence(
int dim,
6460 std::string FEType1,
6461 std::string FEType2,
6465 MapConstPtr_Type map1_unique,
6466 MapConstPtr_Type map2_unique,
6467 MultiVectorPtr_Type u,
6468 bool callFillComplete)
6470 DomainConstPtr_Type domain1 = domainVec_.at(FEloc1);
6471 ElementsPtr_Type elements = domain1->getElementsC();
6472 vec2D_dbl_ptr_Type pointsRep = domain1->getPointsRepeated();
6473 MapConstPtr_Type map1_rep = domain1->getMapRepeated();
6476 DomainConstPtr_Type domain2 = domainVec_.at(FEloc2);
6477 MapConstPtr_Type map2_rep = domain2->getMapRepeated();
6478 ElementsPtr_Type elements2 = domain2->getElementsC();
6480 vec3D_dbl_ptr_Type dPhiU;
6481 vec2D_dbl_ptr_Type phiU;
6482 vec2D_dbl_ptr_Type phiP;
6483 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
6484 vec2D_dbl_ptr_Type quadPts;
6486 UN extraDeg = Helper::determineDegree( dim, FEType1, Helper::Deriv1);
6487 UN deg = Helper::determineDegree( dim, FEType1, Helper::Deriv0) + 2*extraDeg;
6490 Helper::getDPhi(dPhiU, weights, dim, FEType1, deg);
6491 Helper::getPhi(phiU, weights, dim, FEType1, deg);
6492 Helper::getPhi(phiP, weights, dim, FEType2, deg);
6493 Helper::getQuadratureValues(dim, deg, quadPts, weights, FEType1);
6498 SmallMatrix<SC> B(dim);
6499 SmallMatrix<SC> Binv(dim);
6503 Teuchos::ArrayRCP< const SC > uArray = u->getData(0);
6508 double valDB_1, valDB_2;
6509 vec_dbl_Type p1(3,0.0), p2(3,0.0), p3(3,0.0);
6514 vec2D_dbl_Type u11(1, vec_dbl_Type(weights->size(), -1.));
6515 vec2D_dbl_Type u12(1, vec_dbl_Type(weights->size(), -1.));
6516 vec2D_dbl_Type u21(1, vec_dbl_Type(weights->size(), -1.));
6517 vec2D_dbl_Type u22(1, vec_dbl_Type(weights->size(), -1.));
6519 for (
int T = 0; T < elements->numberElements(); T++)
6521 p1 = pointsRep->at(elements->getElement(T).getNode(0));
6522 p2 = pointsRep->at(elements->getElement(T).getNode(1));
6523 p3 = pointsRep->at(elements->getElement(T).getNode(2));
6525 Helper::buildTransformation(elements->getElement(T).getVectorNodeList(), pointsRep, B);
6526 detB = B.computeInverse(Binv);
6527 absDetB = std::fabs(detB);
6530 vec3D_dbl_Type dPhiTransU( dPhiU->size(), vec2D_dbl_Type( dPhiU->at(0).size(), vec_dbl_Type(dim,0.) ) );
6531 applyBTinv( dPhiU, dPhiTransU, Binv );
6535 for(
int k = 0; k < dPhiTransU.size(); k++)
6541 for(
int i = 0; i < dPhiTransU[0].size(); i++)
6543 LO index1 = dim * elements2->getElement(T).getNode(i) + 0;
6544 LO index2 = dim * elements2->getElement(T).getNode(i) + 1;
6545 u11[0][k] += uArray[index1] * dPhiTransU[k][i][0];
6546 u12[0][k] += uArray[index1] * dPhiTransU[k][i][1];
6547 u21[0][k] += uArray[index2] * dPhiTransU[k][i][0];
6548 u22[0][k] += uArray[index2] * dPhiTransU[k][i][1];
6553 for (
int i = 0; i < phiP->at(0).size(); i++)
6555 Teuchos::Array<SC> value1( 1, 0. );
6556 Teuchos::Array<SC> value2( 1, 0. );
6557 Teuchos::Array<GO> indices( 1, 0 );
6559 for (
int j = 0; j < dPhiU->at(0).size(); j++)
6564 for (
int k = 0; k < dPhiU->size(); k++)
6567 valDB_1 = valDB_1 + weights->at(k) *
6568 ( phiP->at(k).at(i) * ( -u21[0][k] * dPhiTransU[k][j][1] + u22[0][k] * dPhiTransU[k][j][0] ) );
6569 valDB_2 = valDB_2 + weights->at(k) *
6570 ( phiP->at(k).at(i) * ( u11[0][k] * dPhiTransU[k][j][1] - u12[0][k] * dPhiTransU[k][j][0] ) );
6576 val1 = absDetB * val1;
6577 val2 = absDetB * val2;
6582 glob_j = dim * map2_rep->getGlobalElement(elements2->getElement(T).getNode(j));
6583 glob_i = map1_rep->getGlobalElement(elements->getElement(T).getNode(i));
6584 indices[0] = glob_j;
6586 DB->insertGlobalValues(glob_i, indices(), value1());
6588 indices[0] = glob_j;
6589 DB->insertGlobalValues(glob_i, indices(), value2());
6593 if (callFillComplete)
6595 DB->fillComplete(map2_unique, map1_unique);
6600 double val1, val2, val3;
6601 double valDB_1, valDB_2, valDB_3;
6602 vec_dbl_Type p1(3,0.0), p2(3,0.0), p3(3,0.0), p4(3,0.0);
6607 vec2D_dbl_Type u11(1, vec_dbl_Type(weights->size(), -1.));
6608 vec2D_dbl_Type u12(1, vec_dbl_Type(weights->size(), -1.));
6609 vec2D_dbl_Type u13(1, vec_dbl_Type(weights->size(), -1.));
6610 vec2D_dbl_Type u21(1, vec_dbl_Type(weights->size(), -1.));
6611 vec2D_dbl_Type u22(1, vec_dbl_Type(weights->size(), -1.));
6612 vec2D_dbl_Type u23(1, vec_dbl_Type(weights->size(), -1.));
6613 vec2D_dbl_Type u31(1, vec_dbl_Type(weights->size(), -1.));
6614 vec2D_dbl_Type u32(1, vec_dbl_Type(weights->size(), -1.));
6615 vec2D_dbl_Type u33(1, vec_dbl_Type(weights->size(), -1.));
6617 for (
int T = 0; T < elements->numberElements(); T++)
6619 p1 = pointsRep->at(elements->getElement(T).getNode(0));
6620 p2 = pointsRep->at(elements->getElement(T).getNode(1));
6621 p3 = pointsRep->at(elements->getElement(T).getNode(2));
6622 p4 = pointsRep->at(elements->getElement(T).getNode(3));
6624 Helper::buildTransformation(elements->getElement(T).getVectorNodeList(), pointsRep, B);
6625 detB = B.computeInverse(Binv);
6626 absDetB = std::fabs(detB);
6629 vec3D_dbl_Type dPhiTransU( dPhiU->size(), vec2D_dbl_Type( dPhiU->at(0).size(), vec_dbl_Type(dim,0.) ) );
6630 applyBTinv( dPhiU, dPhiTransU, Binv );
6634 for(
int k = 0; k < dPhiTransU.size(); k++)
6646 for(
int i = 0; i < dPhiTransU[0].size(); i++)
6648 LO index1 = dim * elements2->getElement(T).getNode(i) + 0;
6649 LO index2 = dim * elements2->getElement(T).getNode(i) + 1;
6650 LO index3 = dim * elements2->getElement(T).getNode(i) + 2;
6651 u11[0][k] += uArray[index1] * dPhiTransU[k][i][0];
6652 u12[0][k] += uArray[index1] * dPhiTransU[k][i][1];
6653 u13[0][k] += uArray[index1] * dPhiTransU[k][i][2];
6654 u21[0][k] += uArray[index2] * dPhiTransU[k][i][0];
6655 u22[0][k] += uArray[index2] * dPhiTransU[k][i][1];
6656 u23[0][k] += uArray[index2] * dPhiTransU[k][i][2];
6657 u31[0][k] += uArray[index3] * dPhiTransU[k][i][0];
6658 u32[0][k] += uArray[index3] * dPhiTransU[k][i][1];
6659 u33[0][k] += uArray[index3] * dPhiTransU[k][i][2];
6663 for (
int i = 0; i < phiP->at(0).size(); i++)
6665 Teuchos::Array<SC> value1( 1, 0. );
6666 Teuchos::Array<SC> value2( 1, 0. );
6667 Teuchos::Array<SC> value3( 1, 0. );
6668 Teuchos::Array<GO> indices( 1, 0 );
6670 for (
int j = 0; j < dPhiU->at(0).size(); j++)
6676 for (
int k = 0; k < dPhiU->size(); k++)
6679 valDB_1 = valDB_1 + weights->at(k) *
6680 ( phiP->at(k).at(i) * ( -u21[0][k] * dPhiTransU[k][j][1] + u22[0][k] * dPhiTransU[k][j][0] -
6681 u31[0][k] * dPhiTransU[k][j][2] + u33[0][k] * dPhiTransU[k][j][0] ) );
6682 valDB_2 = valDB_2 + weights->at(k) *
6683 ( phiP->at(k).at(i) * ( u11[0][k] * dPhiTransU[k][j][1] - u12[0][k] * dPhiTransU[k][j][0] -
6684 u32[0][k] * dPhiTransU[k][j][2] + u33[0][k] * dPhiTransU[k][j][1] ) );
6685 valDB_3 = valDB_3 + weights->at(k) *
6686 ( phiP->at(k).at(i) * ( u11[0][k] * dPhiTransU[k][j][2] - u13[0][k] * dPhiTransU[k][j][0] +
6687 u22[0][k] * dPhiTransU[k][j][2] - u23[0][k] * dPhiTransU[k][j][1] ) );
6694 val1 = absDetB * val1;
6695 val2 = absDetB * val2;
6696 val3 = absDetB * val3;
6702 glob_j = dim * map2_rep->getGlobalElement(elements2->getElement(T).getNode(j));
6703 glob_i = map1_rep->getGlobalElement(elements->getElement(T).getNode(i));
6704 indices[0] = glob_j;
6706 DB->insertGlobalValues(glob_i, indices(), value1());
6708 indices[0] = glob_j;
6709 DB->insertGlobalValues(glob_i, indices(), value2());
6711 indices[0] = glob_j;
6712 DB->insertGlobalValues(glob_i, indices(), value3());
6716 if (callFillComplete)
6718 DB->fillComplete(map2_unique, map1_unique);
6724template <
class SC,
class LO,
class GO,
class NO>
6725void FE<SC,LO,GO,NO>::assemblySurfaceIntegralExternal(
int dim,
6727 MultiVectorPtr_Type f,
6728 MultiVectorPtr_Type d_rep,
6729 std::vector<SC>& funcParameter,
6731 ParameterListPtr_Type params,
6734 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
6736 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
6739 SmallMatrix<SC> B(dim);
6740 vec_dbl_Type b(dim);
6742 Teuchos::ArrayRCP< SC > valuesF = f->getDataNonConst(0);
6744 int flagSurface = params->sublist(
"Parameter Solid").get(
"Flag Surface",5);
6746 std::vector<double> valueFunc(dim);
6748 SC* paramsFunc = &(funcParameter[0]);
6751 for (UN T=0; T<elements->numberElements(); T++) {
6752 FiniteElement fe = elements->getElement( T );
6753 ElementsPtr_Type subEl = fe.getSubElements();
6754 for (
int surface=0; surface<fe.numSubElements(); surface++) {
6755 FiniteElement feSub = subEl->getElement( surface );
6756 if(subEl->getDimension() == dim-1 ){
6758 vec_int_Type nodeList = feSub.getVectorNodeListNonConst ();
6761 vec_dbl_Type solution_d = getSolution(nodeList, d_rep,dim);
6762 vec2D_dbl_Type nodes;
6763 nodes = getCoordinates(nodeList, pointsRep);
6766 double positions[18];
6768 for(
int i=0;i<6;i++)
6769 for(
int j=0;j<3;j++){
6770 positions[count] = nodes[i][j];
6776 paramsFunc[ funcParameter.size() - 1 ] = feSub.getFlag();
6777 vec_dbl_Type p1 = {0.,0.,0.};
6778 func( &p1[0], &valueFunc[0], paramsFunc);
6780 if(valueFunc[0] != 0.){
6782 double *residuumVector;
6783 #ifdef FEDD_HAVE_ACEGENINTERFACE
6785 AceGenInterface::PressureTriangle3D6 pt(valueFunc[0], 1., 35, &positions[0], &solution_d[0]);
6786 pt.computeTangentResidual();
6787 residuumVector = pt.getResiduum();
6790 for(
int i=0; i< nodeList.size() ; i++){
6791 for(
int d=0; d<dim; d++)
6792 valuesF[nodeList[i]*dim+d] += residuumVector[i*dim+d];
6808template <
class SC,
class LO,
class GO,
class NO>
6811 MultiVectorPtr_Type f,
6812 MultiVectorPtr_Type d_rep,
6813 MatrixPtr_Type &Kext,
6814 std::vector<SC>& funcParameter,
6816 ParameterListPtr_Type params,
6821 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
6823 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
6825 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
6828 vec_dbl_Type b(dim);
6830 Teuchos::ArrayRCP< SC > valuesF = f->getDataNonConst(0);
6832 std::vector<double> valueFunc(dim);
6834 SC* paramsFunc = &(funcParameter[0]);
6837 for (UN T=0; T<elements->numberElements(); T++) {
6839 ElementsPtr_Type subEl = fe.getSubElements();
6840 for (
int surface=0; surface<fe.numSubElements(); surface++) {
6842 if(subEl->getDimension() == dim-1 ){
6843 vec_int_Type nodeList = feSub.getVectorNodeListNonConst ();
6845 vec_dbl_Type solution_d = getSolution(nodeList, d_rep,dim);
6846 vec2D_dbl_Type nodes;
6847 nodes = getCoordinates(nodeList, pointsRep);
6850 double positions[18];
6852 for(
int i=0;i<6;i++){
6853 for(
int j=0;j<3;j++){
6854 positions[count] = nodes[i][j];
6860 vec_dbl_Type p1 = {0.,0.,0.};
6861 paramsFunc[ funcParameter.size() - 1 ] = feSub.getFlag();
6862 func( &p1[0], &valueFunc[0], paramsFunc);
6864 if(valueFunc[0] != 0.){
6866 double *residuumVector;
6869 #ifdef FEDD_HAVE_ACEGENINTERFACE
6870 AceGenInterface::PressureTriangle3D6 pt(valueFunc[0], 1.0, 35, &positions[0], &solution_d[0]);
6871 pt.computeTangentResidual();
6873 residuumVector = pt.getResiduum();
6874 stiffMat = pt.getStiffnessMatrix();
6880 int numNodes1 =nodeList.size();
6882 SmallMatrix_Type elementMatrixPrint(18,0.);
6883 for(
int i=0; i< 18 ; i++){
6884 for(
int j=0; j< 18; j++){
6885 if(std::fabs(stiffMat[i][j]) >1e-13)
6886 elementMatrixPrint[i][j] = stiffMat[i][j];
6891 SmallMatrix_Type elementMatrixWrite(18,0.);
6893 SmallMatrix_Type elementMatrixIDsRow(18,0.);
6894 SmallMatrix_Type elementMatrixIDsCol(18,0.);
6897 for (UN i=0; i < numNodes1 ; i++) {
6898 for(
int di=0; di<dim; di++){
6899 Teuchos::Array<SC> value1( numNodes1*dim, 0. );
6900 Teuchos::Array<GO> columnIndices1( numNodes1*dim, 0 );
6901 GO row =GO (dim* map->getGlobalElement( nodeList[i] )+di);
6902 LO rowLO = dim*i+di;
6904 for (UN j=0; j <numNodes1; j++){
6905 for(
int d=0; d<dim; d++){
6906 columnIndices1[dim*j+d] = GO ( dim * map->getGlobalElement( nodeList[j] ) + d );
6907 value1[dim*j+d] = stiffMat[rowLO][dim*j+d];
6910 Kext->insertGlobalValues( row, columnIndices1(), value1() );
6916 for(
int i=0; i< nodeList.size() ; i++){
6917 for(
int d=0; d<dim; d++){
6918 valuesF[nodeList[i]*dim+d] += residuumVector[i*dim+d];
6930 Kext->fillComplete(domainVec_.at(FEloc)->getMapVecFieldUnique(),domainVec_.at(FEloc)->getMapVecFieldUnique());
6935template <
class SC,
class LO,
class GO,
class NO>
6936void FE<SC,LO,GO,NO>::computeSurfaceNormal(
int dim,
6937 vec2D_dbl_ptr_Type pointsRep,
6938 vec_int_Type nodeList,
6943 vec_dbl_Type p1(dim),p2(dim);
6946 v_E[0] = pointsRep->at(nodeList[0]).at(1) - pointsRep->at(nodeList[1]).at(1);
6947 v_E[1] = -(pointsRep->at(nodeList[0]).at(0) - pointsRep->at(nodeList[1]).at(0));
6948 norm_v_E = std::sqrt(std::pow(v_E[0],2)+std::pow(v_E[1],2));
6953 p1[0] = pointsRep->at(nodeList[0]).at(0) - pointsRep->at(nodeList[1]).at(0);
6954 p1[1] = pointsRep->at(nodeList[0]).at(1) - pointsRep->at(nodeList[1]).at(1);
6955 p1[2] = pointsRep->at(nodeList[0]).at(2) - pointsRep->at(nodeList[1]).at(2);
6957 p2[0] = pointsRep->at(nodeList[0]).at(0) - pointsRep->at(nodeList[2]).at(0);
6958 p2[1] = pointsRep->at(nodeList[0]).at(1) - pointsRep->at(nodeList[2]).at(1);
6959 p2[2] = pointsRep->at(nodeList[0]).at(2) - pointsRep->at(nodeList[2]).at(2);
6961 v_E[0] = p1[1]*p2[2] - p1[2]*p2[1];
6962 v_E[1] = p1[2]*p2[0] - p1[0]*p2[2];
6963 v_E[2] = p1[0]*p2[1] - p1[1]*p2[0];
6965 norm_v_E = std::sqrt(std::pow(v_E[0],2)+std::pow(v_E[1],2)+std::pow(v_E[2],2));
6971template <
class SC,
class LO,
class GO,
class NO>
6972void FE<SC,LO,GO,NO>::assemblySurfaceIntegral(
int dim,
6974 MultiVectorPtr_Type f,
6975 std::string fieldType,
6977 std::vector<SC>& funcParameter) {
6981 UN FEloc = checkFE(dim,FEType);
6983 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
6985 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
6987 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
6988 vec2D_dbl_ptr_Type phi;
6989 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
6991 UN degFunc = funcParameter[funcParameter.size()-1] + 1.e-14;
6992 UN deg = Helper::determineDegree( dim-1, FEType, Helper::Deriv0) + degFunc;
6994 Helper::getPhi(phi, weights, dim-1, FEType, deg);
6996 vec2D_dbl_ptr_Type quadPoints;
6997 vec_dbl_ptr_Type w = Teuchos::rcp(
new vec_dbl_Type(0));
6998 Helper::getQuadratureValues(dim-1, deg, quadPoints, w, FEType);
7002 SmallMatrix<SC> B(dim);
7003 vec_dbl_Type b(dim);
7005 Teuchos::ArrayRCP< SC > valuesF = f->getDataNonConst(0);
7009 std::vector<double> valueFunc(dim);
7011 SC* params = &(funcParameter[0]);
7012 for (UN T=0; T<elements->numberElements(); T++) {
7013 FiniteElement fe = elements->getElement( T );
7014 ElementsPtr_Type subEl = fe.getSubElements();
7015 for (
int surface=0; surface<fe.numSubElements(); surface++) {
7016 FiniteElement feSub = subEl->getElement( surface );
7017 if(subEl->getDimension() == dim-1){
7019 params[ funcParameter.size() - 1 ] = feSub.getFlag();
7021 vec_int_Type nodeList = feSub.getVectorNodeListNonConst ();
7023 vec_dbl_Type v_E(dim,1.);
7026 Helper::computeSurfaceNormal(dim, pointsRep,nodeList,v_E,norm_v_E);
7028 Helper::buildTransformationSurface( nodeList, pointsRep, B, b, FEType);
7029 elScaling = B.computeScaling( );
7031 for (UN i=0; i < phi->at(0).size(); i++) {
7032 Teuchos::Array<SC> value(0);
7033 if ( fieldType ==
"Scalar" )
7034 value.resize( 1, 0. );
7035 else if ( fieldType ==
"Vector" )
7036 value.resize( dim, 0. );
7038 for (UN w=0; w<phi->size(); w++) {
7039 vec_dbl_Type x(dim,0.);
7040 for (
int k=0; k<dim; k++) {
7041 for (
int l=0; l<dim-1; l++){
7042 x[ k ] += B[k][l] * (*quadPoints)[ w ][ l ];
7047 func( &x[0], &valueFunc[0], params);
7048 if ( fieldType ==
"Scalar" )
7049 value[0] += weights->at(w) * valueFunc[0] * (*phi)[w][i];
7050 else if ( fieldType ==
"Vector" ){
7051 for (
int j=0; j<value.size(); j++){
7052 value[j] += weights->at(w) * valueFunc[j]*v_E[j]/norm_v_E * (*phi)[w][i];
7057 for (
int j=0; j<value.size(); j++)
7058 value[j] *= elScaling;
7060 if ( fieldType==
"Scalar" )
7061 valuesF[ nodeList[ i ] ] += value[0];
7064 else if ( fieldType==
"Vector" ){
7065 for (
int j=0; j<value.size(); j++)
7066 valuesF[ dim * nodeList[ i ] + j ] += value[j];
7075template <
class SC,
class LO,
class GO,
class NO>
7076void FE<SC,LO,GO,NO>::assemblySurfaceIntegralFlag(
int dim,
7078 MultiVectorPtr_Type f,
7079 std::string fieldType,
7081 std::vector<SC>& funcParameter) {
7084 TEUCHOS_TEST_FOR_EXCEPTION(funcParameter[0]!=0,std::logic_error,
"We only support constant functions for now.");
7086 UN FEloc = checkFE(dim,FEType);
7088 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
7090 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
7092 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
7093 vec2D_dbl_ptr_Type phi;
7094 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
7095 UN degFunc = funcParameter[0] + 1.e-14;
7096 UN deg = Helper::determineDegree( dim-1, FEType, Helper::Deriv0) + degFunc;
7098 Helper::getPhi(phi, weights, dim-1, FEType, deg);
7100 vec2D_dbl_ptr_Type quadPoints;
7101 vec_dbl_ptr_Type w = Teuchos::rcp(
new vec_dbl_Type(0));
7102 Helper::getQuadratureValues(dim-1, deg, quadPoints, w, FEType);
7106 SmallMatrix<SC> B(dim);
7107 vec_dbl_Type b(dim);
7109 Teuchos::ArrayRCP< SC > valuesF = f->getDataNonConst(0);
7112 std::vector<double> valueFunc(dim);
7113 SC* params = &(funcParameter[1]);
7114 for (UN T=0; T<elements->numberElements(); T++) {
7115 FiniteElement fe = elements->getElement( T );
7116 ElementsPtr_Type subEl = fe.getSubElements();
7117 for (
int surface=0; surface<fe.numSubElements(); surface++) {
7118 FiniteElement feSub = subEl->getElement( surface );
7119 if (params[1] == feSub.getFlag()){
7120 FiniteElement feSub = subEl->getElement( surface );
7121 vec_int_Type nodeList = feSub.getVectorNodeListNonConst ();
7122 Helper::buildTransformationSurface( nodeList, pointsRep, B, b, FEType);
7123 elScaling = B.computeScaling( );
7125 for (UN i=0; i < phi->at(0).size(); i++) {
7126 Teuchos::Array<SC> value(0);
7127 if ( fieldType ==
"Scalar" )
7128 value.resize( 1, 0. );
7129 else if ( fieldType ==
"Vector" )
7130 value.resize( dim, 0. );
7132 for (UN w=0; w<phi->size(); w++) {
7133 vec_dbl_Type x(dim,0.);
7134 for (
int k=0; k<dim; k++) {
7135 for (
int l=0; l<dim-1; l++)
7136 x[ k ] += B[k][l] * (*quadPoints)[ w ][ l ];
7140 func( &x[0], &valueFunc[0], params[0], params);
7142 if ( fieldType ==
"Scalar" )
7143 value[0] += weights->at(w) * valueFunc[0] * (*phi)[w][i];
7144 else if ( fieldType ==
"Vector" ){
7145 for (
int j=0; j<value.size(); j++){
7146 value[j] += weights->at(w) * valueFunc[j] * (*phi)[w][i];
7151 for (
int j=0; j<value.size(); j++)
7152 value[j] *= elScaling;
7154 if ( fieldType==
"Scalar" )
7155 valuesF[ nodeList[ i ] ] += value[0];
7158 else if ( fieldType==
"Vector" ){
7159 for (
int j=0; j<value.size(); j++)
7160 valuesF[ dim * nodeList[ i ] + j ] += value[j];
7169template <
class SC,
class LO,
class GO,
class NO>
7170void FE<SC,LO,GO,NO>::assemblyRHS(
int dim,
7172 MultiVectorPtr_Type a,
7173 std::string fieldType,
7175 std::vector<SC>& funcParameter
7178 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
7180 TEUCHOS_TEST_FOR_EXCEPTION( a.is_null(), std::runtime_error,
"MultiVector in assemblyConstRHS is null." );
7181 TEUCHOS_TEST_FOR_EXCEPTION( a->getNumVectors()>1, std::logic_error,
"Implement for numberMV > 1 ." );
7183 FEloc = checkFE(dim,FEType);
7185 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
7187 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
7189 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
7190 vec2D_dbl_ptr_Type phi;
7191 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
7198 UN deg = Helper::determineDegree( dim, FEType, Helper::Deriv0) + degFunc;
7200 vec2D_dbl_ptr_Type quadPoints;
7201 Helper::getQuadratureValues(dim, deg, quadPoints, weights, FEType);
7204 Helper::getPhi(phi, weights, dim, FEType, deg);
7208 SmallMatrix<SC> B(dim);
7210 vec_dbl_Type v_i(dim);
7211 vec_dbl_Type v_j(dim);
7213 Teuchos::ArrayRCP< SC > valuesRhs = a->getDataNonConst(0);
7217 std::vector<double> valueFunc(dim);
7218 SC* paras = &(funcParameter[0]);
7220 func( &x, &valueFunc[0], paras );
7223 for (UN T=0; T<elements->numberElements(); T++) {
7225 Helper::buildTransformation(elements->getElement(T).getVectorNodeList(), pointsRep, B, FEType);
7226 detB = B.computeDet( );
7227 absDetB = std::fabs(detB);
7229 vec2D_dbl_Type quadPointsTrans(weights->size(),vec_dbl_Type(dim));
7230 for(
int i=0; i< weights->size(); i++){
7231 for(
int j=0; j< dim ; j++){
7232 for(
int k=0; k< dim; k++){
7233 quadPointsTrans[i][j] += B[j][k]* quadPoints->at(i).at(k) ;
7235 quadPointsTrans[i][j] += pointsRep->at(elements->getElement(T).getNode(0)).at(j);
7238 for (UN i=0; i < phi->at(0).size(); i++) {
7239 if ( !fieldType.compare(
"Scalar") ) {
7240 value = Teuchos::ScalarTraits<SC>::zero();
7241 for (UN w=0; w<weights->size(); w++){
7242 func(&quadPointsTrans[w][0], &valueFunc[0] ,paras);
7243 value += weights->at(w) * phi->at(w).at(i)*valueFunc[0];
7246 LO row = (LO) elements->getElement(T).getNode(i);
7247 valuesRhs[row] += value;
7249 else if( !fieldType.compare(
"Vector") ) {
7250 for (UN d=0; d<dim; d++) {
7251 value = Teuchos::ScalarTraits<SC>::zero();
7252 for (UN w=0; w<weights->size(); w++){
7253 func(&quadPointsTrans[w][0], &valueFunc[0] ,paras);
7254 value += weights->at(w) * phi->at(w).at(i)*valueFunc[d];
7258 LO row = (LO) ( dim * elements->getElement(T).getNode(i) + d );
7259 valuesRhs[row] += v_i;
7263 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Invalid field type." );
7272template <
class SC,
class LO,
class GO,
class NO>
7279 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
7281 TEUCHOS_TEST_FOR_EXCEPTION( a.is_null(), std::runtime_error,
"Matrix is null." );
7284 FEloc = checkFE(dim,FEType);
7286 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
7288 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
7290 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
7291 vec2D_dbl_ptr_Type phi;
7292 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
7296 vec2D_dbl_ptr_Type quadPoints;
7305 vec_dbl_Type v_i(dim);
7306 vec_dbl_Type v_j(dim);
7309 for (UN T=0; T<elements->numberElements(); T++) {
7312 detB = B.computeDet( );
7313 absDetB = std::fabs(detB);
7315 for (UN i=0; i < phi->at(0).size(); i++) {
7316 Teuchos::Array<SC> value( 1, 0. );
7317 for (UN w=0; w<weights->size(); w++){
7318 value[0] += weights->at(w) * phi->at(w).at(i)*1.0;
7320 value[0] *= absDetB;
7321 LO row = (LO) elements->getElement(T).getNode(i);
7322 Teuchos::Array<GO> columnIndices( 1, 0 );
7324 a->insertGlobalValues( row, columnIndices(), value() );
7325 columnIndices[0] = row;
7326 aT->insertGlobalValues( 0, columnIndices(), value() );
7335template <
class SC,
class LO,
class GO,
class NO>
7336void FE<SC,LO,GO,NO>::assemblyRHSDegTest(
int dim,
7338 MultiVectorPtr_Type a,
7339 std::string fieldType,
7341 std::vector<SC>& funcParameter,
7344 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
7346 TEUCHOS_TEST_FOR_EXCEPTION( a.is_null(), std::runtime_error,
"MultiVector in assemblyConstRHS is null." );
7347 TEUCHOS_TEST_FOR_EXCEPTION( a->getNumVectors()>1, std::logic_error,
"Implement for numberMV > 1 ." );
7349 UN FEloc = checkFE(dim,FEType);
7351 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
7353 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
7355 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
7356 vec2D_dbl_ptr_Type phi;
7357 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
7360 vec2D_dbl_ptr_Type quadPoints;
7361 vec_dbl_ptr_Type w = Teuchos::rcp(
new vec_dbl_Type(0));
7369 vec_dbl_Type b(dim);
7371 vec_dbl_Type v_i(dim);
7372 vec_dbl_Type v_j(dim);
7374 Teuchos::ArrayRCP< SC > valuesRhs = a->getDataNonConst(0);
7378 std::vector<double> valueFunc(dim);
7379 SC* params = &(funcParameter[1]);
7380 for (UN T=0; T<elements->numberElements(); T++) {
7383 detB = B.computeDet( );
7384 absDetB = std::fabs(detB);
7386 for (UN i=0; i < phi->at(0).size(); i++) {
7387 Teuchos::Array<SC> value(1);
7388 for (UN w=0; w<weights->size(); w++){
7389 vec_dbl_Type x(dim,0.);
7390 for (
int k=0; k<dim; k++) {
7391 for (
int l=0; l<dim; l++)
7392 x[ k ] += B[k][l] * (*quadPoints)[ w ][ l ] + b[k];
7395 func( &x[0], &valueFunc[0], params);
7396 if ( !fieldType.compare(
"Scalar") ) {
7397 value[0] += weights->at(w) * valueFunc[0] * (*phi)[w][i];
7399 else if( !fieldType.compare(
"Vector") ) {
7400 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"No test for field type Vector." );
7403 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Invalid field type." );
7406 value[0] *= absDetB;
7407 LO row = (LO) elements->getElement(T).getNode(i);
7408 valuesRhs[row] += value[0];
7415template <
class SC,
class LO,
class GO,
class NO>
7416void FE<SC,LO,GO,NO>::buildFullDPhi(vec3D_dbl_ptr_Type dPhi, Teuchos::Array<SmallMatrix<double> >& dPhiMat){
7418 TEUCHOS_TEST_FOR_EXCEPTION(dPhi->size()*dPhi->at(0).size()*dPhi->at(0).at(0).size() != dPhiMat.size(), std::logic_error,
"Wrong sizes for dPhi and dPhiMat.");
7420 int dim = dPhi->at(0).at(0).size();
7421 int nmbBasisFunc = dPhi->at(0).size();
7422 int nmbTotalBasisFunc = nmbBasisFunc * dim;
7424 for (
int p=0; p<dPhi->size(); p++) {
7425 for (
int i=0; i<nmbBasisFunc; i++) {
7426 dPhiMat[ p * nmbTotalBasisFunc + dim*i ][0][0] = dPhi->at(p).at(i).at(0);
7427 dPhiMat[ p * nmbTotalBasisFunc + dim*i ][0][1] = dPhi->at(p).at(i).at(1);
7428 dPhiMat[ p * nmbTotalBasisFunc + dim*i ][1][0] = 0.;
7429 dPhiMat[ p * nmbTotalBasisFunc + dim*i ][1][1] = 0.;
7431 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 1 ][0][0] = 0.;
7432 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 1 ][0][1] = 0.;
7433 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 1 ][1][0] = dPhi->at(p).at(i).at(0);
7434 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 1 ][1][1] = dPhi->at(p).at(i).at(1);
7439 for (
int p=0; p<dPhi->size(); p++) {
7440 for (
int i=0; i<nmbBasisFunc; i++) {
7441 dPhiMat[ p * nmbTotalBasisFunc + dim*i ][0][0] = dPhi->at(p).at(i).at(0);
7442 dPhiMat[ p * nmbTotalBasisFunc + dim*i ][0][1] = dPhi->at(p).at(i).at(1);
7443 dPhiMat[ p * nmbTotalBasisFunc + dim*i ][0][2] = dPhi->at(p).at(i).at(2);
7444 dPhiMat[ p * nmbTotalBasisFunc + dim*i ][1][0] = 0.;
7445 dPhiMat[ p * nmbTotalBasisFunc + dim*i ][1][1] = 0.;
7446 dPhiMat[ p * nmbTotalBasisFunc + dim*i ][1][2] = 0.;
7447 dPhiMat[ p * nmbTotalBasisFunc + dim*i ][2][0] = 0.;
7448 dPhiMat[ p * nmbTotalBasisFunc + dim*i ][2][1] = 0.;
7449 dPhiMat[ p * nmbTotalBasisFunc + dim*i ][2][2] = 0.;
7451 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 1 ][0][0] = 0.;
7452 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 1 ][0][1] = 0.;
7453 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 1 ][0][2] = 0.;
7454 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 1 ][1][0] = dPhi->at(p).at(i).at(0);
7455 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 1 ][1][1] = dPhi->at(p).at(i).at(1);
7456 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 1 ][1][2] = dPhi->at(p).at(i).at(2);
7457 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 1 ][2][0] = 0.;
7458 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 1 ][2][1] = 0.;
7459 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 1 ][2][2] = 0.;
7461 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 2 ][0][0] = 0.;
7462 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 2 ][0][1] = 0.;
7463 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 2 ][0][2] = 0.;
7464 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 2 ][1][0] = 0.;
7465 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 2 ][1][1] = 0.;
7466 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 2 ][1][2] = 0.;
7467 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 2 ][2][0] = dPhi->at(p).at(i).at(0);
7468 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 2 ][2][1] = dPhi->at(p).at(i).at(1);
7469 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 2 ][2][2] = dPhi->at(p).at(i).at(2);
7475template <
class SC,
class LO,
class GO,
class NO>
7476void FE<SC,LO,GO,NO>::fillMatrixArray(SmallMatrix<double> &matIn,
double* matArrayOut, std::string order,
int offset){
7477 if (!order.compare(
"cols")) {
7478 for (
int j=0; j<matIn.size(); j++) {
7479 for (
int i=0; i<matIn.size(); i++) {
7480 matArrayOut[ j * matIn.size() + i + offset ] = matIn[i][j];
7484 else if(!order.compare(
"rows")) {
7485 for (
int i=0; i<matIn.size(); i++) {
7486 for (
int j=0; j<matIn.size(); j++) {
7487 matArrayOut[ i * matIn.size() + j + offset ] = matIn[i][j];
7492 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Unknown ordering for matrix to array conversion. Choose rows or cols.");
7495template <
class SC,
class LO,
class GO,
class NO>
7496void FE<SC,LO,GO,NO>::epsilonTensor(vec_dbl_Type &basisValues, SmallMatrix<SC> &epsilonValues,
int activeDof){
7498 for (
int i=0; i<epsilonValues.size(); i++) {
7499 for (
int j=0; j<epsilonValues.size(); j++) {
7500 epsilonValues[i][j] = 0.;
7502 epsilonValues[i][j] += 0.5*basisValues.at(j);
7505 epsilonValues[i][j] += 0.5*basisValues.at(i);
9362template <
class SC,
class LO,
class GO,
class NO>
9363int FE<SC,LO,GO,NO>::checkFE(
int dim,
9364 std::string FEType){
9367 std::vector<int> matches;
9368 for (
int i = 0; i < domainVec_.size(); i++) {
9369 if (domainVec_.at(i)->getDimension() == dim)
9370 matches.push_back(i);
9374 for (
int i = 0; i < matches.size();i++) {
9375 if (domainVec_.at( matches.at(i) )->getFEType() == FEType) {
9376 FEloc = matches.at(i);
9381 TEUCHOS_TEST_FOR_EXCEPTION(!found, std::logic_error ,
"Combination of dimenson(2/3) and FE Type(P1/P2) not defined yet. Use addFE(domain)");
9399template <
class SC,
class LO,
class GO,
class NO>
9400void FE<SC,LO,GO,NO>::nh3d(
double* v,
double (*E),
double (*Nu),
double** F ,
double** Pmat,
double**** Amat)
9404 v[323]=(*E)/(1e0+(*Nu));
9405 v[3]=((*Nu)*v[323])/(1e0-2e0*(*Nu));
9415 v[18]=F[0][0]*F[0][1]+F[1][0]*F[1][1]+F[2][0]*F[2][1];
9416 v[335]=(v[18]*v[18]);
9418 v[24]=F[0][1]*F[0][2]+F[1][1]*F[1][2]+F[2][1]*F[2][2];
9419 v[334]=(v[24]*v[24]);
9421 v[22]=F[0][0]*F[0][2]+F[1][0]*F[1][2]+F[2][0]*F[2][2];
9422 v[15]=Power(F[0][0],2)+Power(F[1][0],2)+Power(F[2][0],2);
9423 v[228]=-(F[2][1]*v[18]);
9424 v[225]=F[2][2]*v[18];
9425 v[217]=-(F[1][1]*v[18]);
9426 v[214]=F[1][2]*v[18];
9427 v[194]=-(F[2][0]*v[18]);
9428 v[185]=-(F[1][0]*v[18]);
9429 v[268]=F[2][1]*v[22];
9430 v[264]=-(F[2][2]*v[22]);
9431 v[255]=F[1][1]*v[22];
9432 v[251]=-(F[1][2]*v[22]);
9433 v[190]=-(F[2][0]*v[22]);
9434 v[181]=-(F[1][0]*v[22]);
9435 v[172]=-(F[0][0]*v[22]);
9436 v[20]=Power(F[0][1],2)+Power(F[1][1],2)+Power(F[2][1],2);
9437 v[324]=-(v[20]*v[22]);
9438 v[327]=2e0*(v[324]+v[325]);
9442 v[138]=v[15]*v[20]-v[335];
9443 v[270]=F[2][0]*v[24];
9444 v[260]=-(F[2][2]*v[24]);
9445 v[257]=F[1][0]*v[24];
9446 v[247]=-(F[1][2]*v[24]);
9447 v[244]=F[0][0]*v[24];
9448 v[232]=-(F[0][2]*v[24]);
9449 v[222]=-(F[2][1]*v[24]);
9450 v[211]=-(F[1][1]*v[24]);
9451 v[198]=-(F[0][1]*v[24]);
9452 v[168]=v[18]*v[22]-v[15]*v[24];
9456 v[38]=-(v[22]*v[22]);
9457 v[26]=Power(F[0][2],2)+Power(F[1][2],2)+Power(F[2][2],2);
9458 v[333]=v[20]*v[26]-v[334];
9459 v[351]=2e0*F[0][0]*v[333];
9460 v[236]=v[22]*v[24]-v[18]*v[26];
9469 v[148]=v[15]*v[26]+v[38];
9470 v[29]=v[148]*v[20]+2e0*v[22]*v[325]-v[15]*v[334]-v[26]*v[335];
9471 v[336]=1e0/Power(v[29],2);
9472 v[32]=-v[5]+v[3]*std::log(std::sqrt(v[29]));
9473 v[337]=(v[3]/4e0-v[32]/2e0)*v[336];
9474 v[137]=v[337]*(F[2][1]*v[326]+F[2][0]*v[327]-v[335]*v[88]+v[15]*v[94]);
9475 v[147]=v[137]*v[138];
9476 v[136]=v[337]*(F[2][2]*v[329]+F[2][0]*v[330]+v[38]*v[67]+v[15]*v[93]);
9477 v[156]=v[136]*v[148];
9478 v[135]=v[337]*(F[2][2]*v[327]+F[2][1]*v[328]-v[334]*v[58]+v[20]*v[99]);
9479 v[165]=v[135]*v[333];
9480 v[134]=v[337]*(F[1][1]*v[326]+F[1][0]*v[327]-v[335]*v[87]+v[15]*v[92]);
9481 v[144]=v[134]*v[138];
9482 v[133]=v[337]*(F[1][2]*v[331]+F[1][0]*v[332]+v[38]*v[66]+v[15]*v[91]);
9483 v[153]=v[133]*v[148];
9484 v[132]=v[337]*(F[1][2]*v[327]+F[1][1]*v[328]-v[334]*v[57]+v[20]*v[97]);
9485 v[162]=v[132]*v[333];
9486 v[131]=v[337]*(F[0][0]*v[327]+F[0][1]*v[329]-v[335]*v[86]+v[15]*v[90]);
9487 v[130]=v[337]*(F[0][2]*v[331]+F[0][0]*v[332]+v[38]*v[65]+v[15]*v[89]);
9488 v[128]=v[337]*(F[0][2]*v[327]+F[0][1]*v[330]+v[351]);
9489 v[37]=v[32]/(2e0*v[29]);
9490 v[355]=v[37]*(2e0*v[172]+v[15]*v[86]);
9491 v[353]=v[37]*(2e0*v[232]+v[89]);
9492 v[352]=v[37]*(2e0*v[198]+v[90]);
9493 v[349]=-2e0*(F[1][0]*v[20]+v[217])*v[37];
9494 v[348]=-(v[37]*(2e0*v[185]+v[15]*v[66]));
9495 v[347]=-2e0*(F[2][0]*v[20]+v[228])*v[37];
9496 v[346]=-(v[37]*(2e0*v[194]+v[15]*v[67]));
9497 v[345]=-(v[37]*(2e0*v[251]+v[97]));
9498 v[344]=-(v[37]*(2e0*v[181]+v[15]*v[87]));
9499 v[343]=-(v[37]*(2e0*v[264]+v[99]));
9500 v[342]=-(v[37]*(2e0*v[190]+v[15]*v[88]));
9501 v[341]=-(v[37]*(2e0*v[247]+v[91]));
9502 v[340]=-(v[37]*(2e0*v[211]+v[92]));
9503 v[339]=-(v[37]*(2e0*v[260]+v[93]));
9504 v[338]=-(v[37]*(2e0*v[222]+v[94]));
9505 v[272]=v[137]*v[328]+v[37]*(2e0*v[268]+2e0*v[270]-2e0*v[18]*v[88]);
9506 v[267]=v[136]*v[328]+v[343];
9507 v[263]=v[135]*v[328]+v[339];
9508 v[259]=v[134]*v[328]+v[37]*(2e0*v[255]+2e0*v[257]-2e0*v[18]*v[87]);
9509 v[254]=v[133]*v[328]+v[345];
9510 v[250]=v[132]*v[328]+v[341];
9511 v[246]=v[131]*v[328]+v[37]*(2e0*F[0][1]*v[22]+2e0*v[244]-2e0*v[18]*v[86]);
9512 v[241]=v[130]*v[328]+2e0*(F[0][2]*v[22]-F[0][0]*v[26])*v[37];
9513 v[231]=v[137]*v[327]+v[347];
9514 v[227]=v[136]*v[327]+v[37]*(2e0*v[225]+2e0*v[270]-2e0*v[22]*v[67]);
9515 v[224]=v[135]*v[327]+v[338];
9516 v[301]=2e0*F[1][0]*v[165]+F[1][2]*v[224]+F[1][1]*v[263];
9517 v[279]=2e0*F[0][0]*v[165]+F[0][2]*v[224]+F[0][1]*v[263];
9518 v[220]=v[134]*v[327]+v[349];
9519 v[216]=v[133]*v[327]+v[37]*(2e0*v[214]+2e0*v[257]-2e0*v[22]*v[66]);
9520 v[213]=v[132]*v[327]+v[340];
9521 v[276]=2e0*F[0][0]*v[162]+F[0][2]*v[213]+F[0][1]*v[250];
9522 v[209]=v[131]*v[327]+2e0*(F[0][1]*v[18]-F[0][0]*v[20])*v[37];
9523 v[196]=v[137]*v[326]+v[346];
9524 v[314]=2e0*F[1][2]*v[147]+F[1][1]*v[196]+F[1][0]*v[231];
9525 v[296]=2e0*F[0][2]*v[147]+F[0][1]*v[196]+F[0][0]*v[231];
9526 v[192]=v[136]*v[326]+v[342];
9527 v[308]=2e0*F[1][1]*v[156]+F[1][2]*v[192]+F[1][0]*v[267];
9528 v[288]=2e0*F[0][1]*v[156]+F[0][2]*v[192]+F[0][0]*v[267];
9529 v[188]=v[135]*v[326]+v[37]*(2e0*v[225]+2e0*v[268]-2e0*v[24]*v[58]);
9530 v[187]=v[134]*v[326]+v[348];
9531 v[293]=2e0*F[0][2]*v[144]+F[0][1]*v[187]+F[0][0]*v[220];
9532 v[183]=v[133]*v[326]+v[344];
9533 v[285]=2e0*F[0][1]*v[153]+F[0][2]*v[183]+F[0][0]*v[254];
9534 v[179]=v[132]*v[326]+v[37]*(2e0*v[214]+2e0*v[255]-2e0*v[24]*v[57]);
9535 v[178]=v[131]*v[326]+2e0*(-(F[0][1]*v[15])+F[0][0]*v[18])*v[37];
9536 v[167]=v[137]*v[333]-v[338];
9537 v[303]=2e0*F[1][0]*v[167]+F[1][2]*v[231]+F[1][1]*v[272];
9538 v[281]=2e0*F[0][0]*v[167]+F[0][2]*v[231]+F[0][1]*v[272];
9539 v[166]=v[136]*v[333]-v[339];
9540 v[302]=2e0*F[1][0]*v[166]+F[1][2]*v[227]+F[1][1]*v[267];
9541 v[280]=2e0*F[0][0]*v[166]+F[0][2]*v[227]+F[0][1]*v[267];
9542 v[164]=v[134]*v[333]-v[340];
9543 v[278]=2e0*F[0][0]*v[164]+F[0][2]*v[220]+F[0][1]*v[259];
9544 v[163]=v[133]*v[333]-v[341];
9545 v[277]=2e0*F[0][0]*v[163]+F[0][2]*v[216]+F[0][1]*v[254];
9546 v[157]=v[137]*v[148]-v[342];
9547 v[309]=2e0*F[1][1]*v[157]+F[1][2]*v[196]+F[1][0]*v[272];
9548 v[289]=2e0*F[0][1]*v[157]+F[0][2]*v[196]+F[0][0]*v[272];
9549 v[155]=v[135]*v[148]-v[343];
9550 v[307]=2e0*F[1][1]*v[155]+F[1][2]*v[188]+F[1][0]*v[263];
9551 v[287]=2e0*F[0][1]*v[155]+F[0][2]*v[188]+F[0][0]*v[263];
9552 v[154]=v[134]*v[148]-v[344];
9553 v[286]=2e0*F[0][1]*v[154]+F[0][2]*v[187]+F[0][0]*v[259];
9554 v[284]=F[0][2]*v[179]+F[0][0]*v[250]+2e0*F[0][1]*(v[132]*v[148]-v[345]);
9555 v[146]=v[136]*v[138]-v[346];
9556 v[313]=2e0*F[1][2]*v[146]+F[1][1]*v[192]+F[1][0]*v[227];
9557 v[295]=2e0*F[0][2]*v[146]+F[0][1]*v[192]+F[0][0]*v[227];
9558 v[145]=v[135]*v[138]-v[347];
9559 v[312]=2e0*F[1][2]*v[145]+F[1][1]*v[188]+F[1][0]*v[224];
9560 v[294]=2e0*F[0][2]*v[145]+F[0][1]*v[188]+F[0][0]*v[224];
9561 v[292]=F[0][1]*v[183]+F[0][0]*v[216]+2e0*F[0][2]*(v[133]*v[138]-v[348]);
9562 v[291]=F[0][1]*v[179]+F[0][0]*v[213]+(v[132]*v[138]-v[349])*v[356];
9563 v[35]=v[36]+v[138]*v[37];
9565 v[40]=v[36]+v[148]*v[37];
9567 v[43]=v[36]+v[333]*v[37];
9570 v[319]=2e0*F[2][1]*v[157]+F[2][2]*v[196]+F[2][0]*v[272]+v[44];
9571 v[306]=2e0*F[1][1]*v[154]+F[1][2]*v[187]+F[1][0]*v[259]+v[44];
9572 v[283]=F[0][2]*v[178]+F[0][0]*v[246]+v[354]*(v[131]*v[148]+v[355])+v[44];
9574 v[317]=2e0*F[2][0]*v[167]+F[2][2]*v[231]+F[2][1]*v[272]+v[45];
9575 v[300]=2e0*F[1][0]*v[164]+F[1][2]*v[220]+F[1][1]*v[259]+v[45];
9576 v[275]=F[0][2]*v[209]+F[0][1]*v[246]+2e0*F[0][0]*(v[131]*v[333]+v[352])+v[45];
9578 v[316]=2e0*F[2][0]*v[166]+F[2][2]*v[227]+F[2][1]*v[267]+v[46];
9579 v[299]=2e0*F[1][0]*v[163]+F[1][2]*v[216]+F[1][1]*v[254]+v[46];
9580 v[274]=F[0][1]*v[241]+2e0*F[0][0]*(v[130]*v[333]+v[353])+v[46]+F[0][2]*(v[130]*v[327]+v[37]*
9581 (2e0*F[0][2]*v[18]+2e0*v[244]-2e0*v[22]*v[65]));
9582 Pmat[0][0]=F[0][0]*v[297]+F[0][2]*v[45]+F[0][1]*v[46];
9583 Pmat[0][1]=F[0][1]*v[304]+F[0][2]*v[44]+F[0][0]*v[46];
9584 Pmat[0][2]=F[0][2]*v[310]+F[0][1]*v[44]+F[0][0]*v[45];
9585 Pmat[1][0]=2e0*F[1][0]*v[43]+F[1][2]*v[45]+F[1][1]*v[46];
9586 Pmat[1][1]=2e0*F[1][1]*v[40]+F[1][2]*v[44]+F[1][0]*v[46];
9587 Pmat[1][2]=2e0*F[1][2]*v[35]+F[1][1]*v[44]+F[1][0]*v[45];
9588 Pmat[2][0]=F[2][0]*v[297]+F[2][2]*v[45]+F[2][1]*v[46];
9589 Pmat[2][1]=F[2][1]*v[304]+F[2][2]*v[44]+F[2][0]*v[46];
9590 Pmat[2][2]=F[2][2]*v[310]+F[2][1]*v[44]+F[2][0]*v[45];
9591 Amat[0][0][0][0]=v[297]+v[128]*v[351]+F[0][2]*(v[128]*v[327]-v[352])+F[0][1]*(v[128]*v[328]-v[353]
9593 Amat[0][0][0][1]=v[274];
9594 Amat[0][0][0][2]=v[275];
9595 Amat[0][0][1][0]=v[276];
9596 Amat[0][0][1][1]=v[277];
9597 Amat[0][0][1][2]=v[278];
9598 Amat[0][0][2][0]=v[279];
9599 Amat[0][0][2][1]=v[280];
9600 Amat[0][0][2][2]=v[281];
9601 Amat[0][1][0][0]=v[274];
9602 Amat[0][1][0][1]=F[0][0]*v[241]+v[304]+v[130]*v[148]*v[354]+F[0][2]*(v[130]*v[326]-v[355]);
9603 Amat[0][1][0][2]=v[283];
9604 Amat[0][1][1][0]=v[284];
9605 Amat[0][1][1][1]=v[285];
9606 Amat[0][1][1][2]=v[286];
9607 Amat[0][1][2][0]=v[287];
9608 Amat[0][1][2][1]=v[288];
9609 Amat[0][1][2][2]=v[289];
9610 Amat[0][2][0][0]=v[275];
9611 Amat[0][2][0][1]=v[283];
9612 Amat[0][2][0][2]=F[0][1]*v[178]+F[0][0]*v[209]+v[310]+v[131]*v[138]*v[356];
9613 Amat[0][2][1][0]=v[291];
9614 Amat[0][2][1][1]=v[292];
9615 Amat[0][2][1][2]=v[293];
9616 Amat[0][2][2][0]=v[294];
9617 Amat[0][2][2][1]=v[295];
9618 Amat[0][2][2][2]=v[296];
9619 Amat[1][0][0][0]=v[276];
9620 Amat[1][0][0][1]=v[284];
9621 Amat[1][0][0][2]=v[291];
9622 Amat[1][0][1][0]=2e0*F[1][0]*v[162]+F[1][2]*v[213]+F[1][1]*v[250]+v[297];
9623 Amat[1][0][1][1]=v[299];
9624 Amat[1][0][1][2]=v[300];
9625 Amat[1][0][2][0]=v[301];
9626 Amat[1][0][2][1]=v[302];
9627 Amat[1][0][2][2]=v[303];
9628 Amat[1][1][0][0]=v[277];
9629 Amat[1][1][0][1]=v[285];
9630 Amat[1][1][0][2]=v[292];
9631 Amat[1][1][1][0]=v[299];
9632 Amat[1][1][1][1]=2e0*F[1][1]*v[153]+F[1][2]*v[183]+F[1][0]*v[254]+v[304];
9633 Amat[1][1][1][2]=v[306];
9634 Amat[1][1][2][0]=v[307];
9635 Amat[1][1][2][1]=v[308];
9636 Amat[1][1][2][2]=v[309];
9637 Amat[1][2][0][0]=v[278];
9638 Amat[1][2][0][1]=v[286];
9639 Amat[1][2][0][2]=v[293];
9640 Amat[1][2][1][0]=v[300];
9641 Amat[1][2][1][1]=v[306];
9642 Amat[1][2][1][2]=2e0*F[1][2]*v[144]+F[1][1]*v[187]+F[1][0]*v[220]+v[310];
9643 Amat[1][2][2][0]=v[312];
9644 Amat[1][2][2][1]=v[313];
9645 Amat[1][2][2][2]=v[314];
9646 Amat[2][0][0][0]=v[279];
9647 Amat[2][0][0][1]=v[287];
9648 Amat[2][0][0][2]=v[294];
9649 Amat[2][0][1][0]=v[301];
9650 Amat[2][0][1][1]=v[307];
9651 Amat[2][0][1][2]=v[312];
9652 Amat[2][0][2][0]=2e0*F[2][0]*v[165]+F[2][2]*v[224]+F[2][1]*v[263]+v[297];
9653 Amat[2][0][2][1]=v[316];
9654 Amat[2][0][2][2]=v[317];
9655 Amat[2][1][0][0]=v[280];
9656 Amat[2][1][0][1]=v[288];
9657 Amat[2][1][0][2]=v[295];
9658 Amat[2][1][1][0]=v[302];
9659 Amat[2][1][1][1]=v[308];
9660 Amat[2][1][1][2]=v[313];
9661 Amat[2][1][2][0]=v[316];
9662 Amat[2][1][2][1]=2e0*F[2][1]*v[156]+F[2][2]*v[192]+F[2][0]*v[267]+v[304];
9663 Amat[2][1][2][2]=v[319];
9664 Amat[2][2][0][0]=v[281];
9665 Amat[2][2][0][1]=v[289];
9666 Amat[2][2][0][2]=v[296];
9667 Amat[2][2][1][0]=v[303];
9668 Amat[2][2][1][1]=v[309];
9669 Amat[2][2][1][2]=v[314];
9670 Amat[2][2][2][0]=v[317];
9671 Amat[2][2][2][1]=v[319];
9672 Amat[2][2][2][2]=2e0*F[2][2]*v[147]+F[2][1]*v[196]+F[2][0]*v[231]+v[310];
9689template <
class SC,
class LO,
class GO,
class NO>
9690void FE<SC,LO,GO,NO>::mr3d(
double* v,
double (*E),
double (*Nu),
double (*C)
9691 ,
double** F,
double** Pmat,
double**** Amat)
9695 v[4]=(*E)/(2e0+2e0*(*Nu));
9696 v[139]=((*C)*v[4])/2e0;
9697 v[5]=(*E)/(3e0-6e0*(*Nu));
9699 v[150]=v[139]*v[57];
9701 v[165]=v[139]*v[66];
9703 v[167]=v[139]*v[87];
9705 v[155]=v[139]*v[58];
9707 v[170]=v[139]*v[67];
9709 v[172]=v[139]*v[88];
9711 v[159]=v[139]*v[59];
9713 v[175]=v[139]*v[68];
9714 v[18]=F[0][0]*F[0][1]+F[1][0]*F[1][1]+F[2][0]*F[2][1];
9715 v[345]=(v[18]*v[18]);
9717 v[177]=v[139]*v[89];
9718 v[24]=F[0][1]*F[0][2]+F[1][1]*F[1][2]+F[2][1]*F[2][2];
9719 v[344]=(v[24]*v[24]);
9721 v[22]=F[0][0]*F[0][2]+F[1][0]*F[1][2]+F[2][0]*F[2][2];
9722 v[15]=Power(F[0][0],2)+Power(F[1][0],2)+Power(F[2][0],2);
9723 v[239]=-(F[2][1]*v[18]);
9724 v[236]=F[2][2]*v[18];
9725 v[228]=-(F[1][1]*v[18]);
9726 v[225]=F[1][2]*v[18];
9727 v[205]=-(F[2][0]*v[18]);
9728 v[196]=-(F[1][0]*v[18]);
9729 v[279]=F[2][1]*v[22];
9730 v[275]=-(F[2][2]*v[22]);
9731 v[266]=F[1][1]*v[22];
9732 v[262]=-(F[1][2]*v[22]);
9733 v[201]=-(F[2][0]*v[22]);
9734 v[192]=-(F[1][0]*v[22]);
9735 v[183]=-(F[0][0]*v[22]);
9736 v[20]=Power(F[0][1],2)+Power(F[1][1],2)+Power(F[2][1],2);
9737 v[334]=-(v[20]*v[22]);
9738 v[337]=2e0*(v[334]+v[335]);
9742 v[140]=v[15]*v[20]-v[345];
9743 v[281]=F[2][0]*v[24];
9744 v[271]=-(F[2][2]*v[24]);
9745 v[268]=F[1][0]*v[24];
9746 v[258]=-(F[1][2]*v[24]);
9747 v[255]=F[0][0]*v[24];
9748 v[243]=-(F[0][2]*v[24]);
9749 v[233]=-(F[2][1]*v[24]);
9750 v[222]=-(F[1][1]*v[24]);
9751 v[209]=-(F[0][1]*v[24]);
9752 v[179]=v[18]*v[22]-v[15]*v[24];
9756 v[38]=-(v[22]*v[22]);
9757 v[26]=Power(F[0][2],2)+Power(F[1][2],2)+Power(F[2][2],2);
9758 v[343]=v[20]*v[26]-v[344];
9759 v[361]=v[343]*v[57];
9760 v[247]=v[22]*v[24]-v[18]*v[26];
9769 v[151]=v[15]*v[26]+v[38];
9770 v[29]=v[151]*v[20]+2e0*v[22]*v[335]-v[15]*v[344]-v[26]*v[345];
9771 v[346]=1e0/Power(v[29],2);
9772 v[33]=-2e0*v[139]-v[4]+v[5]*std::log(std::sqrt(v[29]));
9773 v[347]=v[346]*(-v[33]/2e0+v[5]/4e0);
9774 v[138]=v[347]*(F[2][1]*v[336]+F[2][0]*v[337]-v[345]*v[89]+v[15]*v[95]);
9775 v[149]=v[138]*v[140];
9776 v[137]=v[347]*(F[2][2]*v[339]+F[2][0]*v[340]+v[38]*v[68]+v[15]*v[94]);
9777 v[161]=v[137]*v[151];
9778 v[136]=v[347]*(v[100]*v[20]+F[2][2]*v[337]+F[2][1]*v[338]-v[344]*v[59]);
9779 v[174]=v[136]*v[343];
9780 v[135]=v[347]*(F[1][1]*v[336]+F[1][0]*v[337]-v[345]*v[88]+v[15]*v[93]);
9781 v[146]=v[135]*v[140];
9782 v[134]=v[347]*(F[1][2]*v[341]+F[1][0]*v[342]+v[38]*v[67]+v[15]*v[92]);
9783 v[157]=v[134]*v[151];
9784 v[133]=v[347]*(F[1][2]*v[337]+F[1][1]*v[338]-v[344]*v[58]+v[20]*v[98]);
9785 v[169]=v[133]*v[343];
9786 v[132]=v[347]*(F[0][0]*v[337]+F[0][1]*v[339]-v[345]*v[87]+v[15]*v[91]);
9787 v[131]=v[347]*(F[0][2]*v[341]+F[0][0]*v[342]+v[38]*v[66]+v[15]*v[90]);
9788 v[129]=v[347]*(F[0][2]*v[337]+F[0][1]*v[340]+v[361]);
9789 v[37]=v[33]/(2e0*v[29]);
9790 v[365]=v[37]*(2e0*v[183]+v[15]*v[87]);
9791 v[363]=v[37]*(2e0*v[243]+v[90]);
9792 v[362]=v[37]*(2e0*v[209]+v[91]);
9793 v[359]=-2e0*(F[1][0]*v[20]+v[228])*v[37];
9794 v[358]=-(v[37]*(2e0*v[196]+v[15]*v[67]));
9795 v[357]=-2e0*(F[2][0]*v[20]+v[239])*v[37];
9796 v[356]=-(v[37]*(2e0*v[205]+v[15]*v[68]));
9797 v[355]=-(v[37]*(2e0*v[262]+v[98]));
9798 v[354]=-(v[37]*(2e0*v[192]+v[15]*v[88]));
9799 v[353]=-((v[100]+2e0*v[275])*v[37]);
9800 v[352]=-(v[37]*(2e0*v[201]+v[15]*v[89]));
9801 v[351]=-(v[37]*(2e0*v[258]+v[92]));
9802 v[350]=-(v[37]*(2e0*v[222]+v[93]));
9803 v[349]=-(v[37]*(2e0*v[271]+v[94]));
9804 v[348]=-(v[37]*(2e0*v[233]+v[95]));
9805 v[283]=v[138]*v[338]+v[37]*(2e0*v[279]+2e0*v[281]-2e0*v[18]*v[89]);
9806 v[278]=-v[159]+v[137]*v[338]+v[353];
9807 v[274]=-v[175]+v[136]*v[338]+v[349];
9808 v[270]=v[135]*v[338]+v[37]*(2e0*v[266]+2e0*v[268]-2e0*v[18]*v[88]);
9809 v[265]=-v[155]+v[134]*v[338]+v[355];
9810 v[261]=-v[170]+v[133]*v[338]+v[351];
9811 v[257]=v[132]*v[338]+v[37]*(2e0*F[0][1]*v[22]+2e0*v[255]-2e0*v[18]*v[87]);
9812 v[252]=-v[150]+v[131]*v[338]+2e0*(F[0][2]*v[22]-F[0][0]*v[26])*v[37];
9813 v[242]=-v[159]+v[138]*v[337]+v[357];
9814 v[238]=v[137]*v[337]+v[37]*(2e0*v[236]+2e0*v[281]-2e0*v[22]*v[68]);
9815 v[235]=-v[177]+v[136]*v[337]+v[348];
9816 v[312]=2e0*F[1][0]*v[174]+F[1][2]*v[235]+F[1][1]*v[274];
9817 v[290]=2e0*F[0][0]*v[174]+F[0][2]*v[235]+F[0][1]*v[274];
9818 v[231]=-v[155]+v[135]*v[337]+v[359];
9819 v[227]=v[134]*v[337]+v[37]*(2e0*v[225]+2e0*v[268]-2e0*v[22]*v[67]);
9820 v[224]=-v[172]+v[133]*v[337]+v[350];
9821 v[287]=2e0*F[0][0]*v[169]+F[0][2]*v[224]+F[0][1]*v[261];
9822 v[220]=-v[150]+v[132]*v[337]+2e0*(F[0][1]*v[18]-F[0][0]*v[20])*v[37];
9823 v[207]=-v[175]+v[138]*v[336]+v[356];
9824 v[325]=2e0*F[1][2]*v[149]+F[1][1]*v[207]+F[1][0]*v[242];
9825 v[307]=2e0*F[0][2]*v[149]+F[0][1]*v[207]+F[0][0]*v[242];
9826 v[203]=-v[177]+v[137]*v[336]+v[352];
9827 v[319]=2e0*F[1][1]*v[161]+F[1][2]*v[203]+F[1][0]*v[278];
9828 v[299]=2e0*F[0][1]*v[161]+F[0][2]*v[203]+F[0][0]*v[278];
9829 v[199]=v[136]*v[336]+v[37]*(2e0*v[236]+2e0*v[279]-2e0*v[24]*v[59]);
9830 v[198]=-v[170]+v[135]*v[336]+v[358];
9831 v[304]=2e0*F[0][2]*v[146]+F[0][1]*v[198]+F[0][0]*v[231];
9832 v[194]=-v[172]+v[134]*v[336]+v[354];
9833 v[296]=2e0*F[0][1]*v[157]+F[0][2]*v[194]+F[0][0]*v[265];
9834 v[190]=v[133]*v[336]+v[37]*(2e0*v[225]+2e0*v[266]-2e0*v[24]*v[58]);
9835 v[189]=-v[165]+v[132]*v[336]+2e0*(-(F[0][1]*v[15])+F[0][0]*v[18])*v[37];
9836 v[178]=v[177]+v[138]*v[343]-v[348];
9837 v[314]=2e0*F[1][0]*v[178]+F[1][2]*v[242]+F[1][1]*v[283];
9838 v[292]=2e0*F[0][0]*v[178]+F[0][2]*v[242]+F[0][1]*v[283];
9839 v[176]=v[175]+v[137]*v[343]-v[349];
9840 v[313]=2e0*F[1][0]*v[176]+F[1][2]*v[238]+F[1][1]*v[278];
9841 v[291]=2e0*F[0][0]*v[176]+F[0][2]*v[238]+F[0][1]*v[278];
9842 v[173]=v[172]+v[135]*v[343]-v[350];
9843 v[289]=2e0*F[0][0]*v[173]+F[0][2]*v[231]+F[0][1]*v[270];
9844 v[171]=v[170]+v[134]*v[343]-v[351];
9845 v[288]=2e0*F[0][0]*v[171]+F[0][2]*v[227]+F[0][1]*v[265];
9846 v[162]=v[138]*v[151]+v[177]-v[352];
9847 v[320]=2e0*F[1][1]*v[162]+F[1][2]*v[207]+F[1][0]*v[283];
9848 v[300]=2e0*F[0][1]*v[162]+F[0][2]*v[207]+F[0][0]*v[283];
9849 v[160]=v[136]*v[151]+v[159]-v[353];
9850 v[318]=2e0*F[1][1]*v[160]+F[1][2]*v[199]+F[1][0]*v[274];
9851 v[298]=2e0*F[0][1]*v[160]+F[0][2]*v[199]+F[0][0]*v[274];
9852 v[158]=v[135]*v[151]+v[172]-v[354];
9853 v[297]=2e0*F[0][1]*v[158]+F[0][2]*v[198]+F[0][0]*v[270];
9854 v[295]=F[0][2]*v[190]+F[0][0]*v[261]+2e0*F[0][1]*(v[133]*v[151]+v[155]-v[355]);
9855 v[148]=v[137]*v[140]+v[175]-v[356];
9856 v[324]=2e0*F[1][2]*v[148]+F[1][1]*v[203]+F[1][0]*v[238];
9857 v[306]=2e0*F[0][2]*v[148]+F[0][1]*v[203]+F[0][0]*v[238];
9858 v[147]=v[136]*v[140]+v[159]-v[357];
9859 v[323]=2e0*F[1][2]*v[147]+F[1][1]*v[199]+F[1][0]*v[235];
9860 v[305]=2e0*F[0][2]*v[147]+F[0][1]*v[199]+F[0][0]*v[235];
9861 v[303]=F[0][1]*v[194]+F[0][0]*v[227]+2e0*F[0][2]*(v[134]*v[140]+v[170]-v[358]);
9862 v[302]=F[0][1]*v[190]+F[0][0]*v[224]+(v[133]*v[140]+v[155]-v[359])*v[366];
9863 v[36]=v[140]*v[37]+((1e0+(*C)*(-1e0+v[15]+v[20]))*v[4])/2e0;
9865 v[40]=v[151]*v[37]+((1e0+(*C)*(-1e0+v[15]+v[26]))*v[4])/2e0;
9867 v[43]=v[343]*v[37]+((1e0+(*C)*(-1e0+v[20]+v[26]))*v[4])/2e0;
9869 v[45]=-2e0*v[139]*v[24]+v[336]*v[37];
9870 v[330]=2e0*F[2][1]*v[162]+F[2][2]*v[207]+F[2][0]*v[283]+v[45];
9871 v[317]=2e0*F[1][1]*v[158]+F[1][2]*v[198]+F[1][0]*v[270]+v[45];
9872 v[294]=F[0][2]*v[189]+F[0][0]*v[257]+v[364]*(v[132]*v[151]+v[167]+v[365])+v[45];
9873 v[46]=-2e0*v[139]*v[22]+v[337]*v[37];
9874 v[328]=2e0*F[2][0]*v[178]+F[2][2]*v[242]+F[2][1]*v[283]+v[46];
9875 v[311]=2e0*F[1][0]*v[173]+F[1][2]*v[231]+F[1][1]*v[270]+v[46];
9876 v[286]=F[0][2]*v[220]+F[0][1]*v[257]+2e0*F[0][0]*(v[167]+v[132]*v[343]+v[362])+v[46];
9877 v[47]=-2e0*v[139]*v[18]+v[338]*v[37];
9878 v[327]=2e0*F[2][0]*v[176]+F[2][2]*v[238]+F[2][1]*v[278]+v[47];
9879 v[310]=2e0*F[1][0]*v[171]+F[1][2]*v[227]+F[1][1]*v[265]+v[47];
9880 v[285]=F[0][1]*v[252]+2e0*F[0][0]*(v[165]+v[131]*v[343]+v[363])+v[47]+F[0][2]*(v[131]*v[337]+v[37]*
9881 (2e0*F[0][2]*v[18]+2e0*v[255]-2e0*v[22]*v[66]));
9882 Pmat[0][0]=F[0][0]*v[308]+F[0][2]*v[46]+F[0][1]*v[47];
9883 Pmat[0][1]=F[0][1]*v[315]+F[0][2]*v[45]+F[0][0]*v[47];
9884 Pmat[0][2]=F[0][2]*v[321]+F[0][1]*v[45]+F[0][0]*v[46];
9885 Pmat[1][0]=2e0*F[1][0]*v[43]+F[1][2]*v[46]+F[1][1]*v[47];
9886 Pmat[1][1]=2e0*F[1][1]*v[40]+F[1][2]*v[45]+F[1][0]*v[47];
9887 Pmat[1][2]=2e0*F[1][2]*v[36]+F[1][1]*v[45]+F[1][0]*v[46];
9888 Pmat[2][0]=F[2][0]*v[308]+F[2][2]*v[46]+F[2][1]*v[47];
9889 Pmat[2][1]=F[2][1]*v[315]+F[2][2]*v[45]+F[2][0]*v[47];
9890 Pmat[2][2]=F[2][2]*v[321]+F[2][1]*v[45]+F[2][0]*v[46];
9891 Amat[0][0][0][0]=v[308]+v[129]*v[361]+F[0][2]*(-v[167]+v[129]*v[337]-v[362])+F[0][1]*(-v[165]
9892 +v[129]*v[338]-v[363]);
9893 Amat[0][0][0][1]=v[285];
9894 Amat[0][0][0][2]=v[286];
9895 Amat[0][0][1][0]=v[287];
9896 Amat[0][0][1][1]=v[288];
9897 Amat[0][0][1][2]=v[289];
9898 Amat[0][0][2][0]=v[290];
9899 Amat[0][0][2][1]=v[291];
9900 Amat[0][0][2][2]=v[292];
9901 Amat[0][1][0][0]=v[285];
9902 Amat[0][1][0][1]=F[0][0]*v[252]+v[315]+v[131]*v[151]*v[364]+F[0][2]*(-v[167]+v[131]*v[336]-v[365]);
9903 Amat[0][1][0][2]=v[294];
9904 Amat[0][1][1][0]=v[295];
9905 Amat[0][1][1][1]=v[296];
9906 Amat[0][1][1][2]=v[297];
9907 Amat[0][1][2][0]=v[298];
9908 Amat[0][1][2][1]=v[299];
9909 Amat[0][1][2][2]=v[300];
9910 Amat[0][2][0][0]=v[286];
9911 Amat[0][2][0][1]=v[294];
9912 Amat[0][2][0][2]=F[0][1]*v[189]+F[0][0]*v[220]+v[321]+v[132]*v[140]*v[366];
9913 Amat[0][2][1][0]=v[302];
9914 Amat[0][2][1][1]=v[303];
9915 Amat[0][2][1][2]=v[304];
9916 Amat[0][2][2][0]=v[305];
9917 Amat[0][2][2][1]=v[306];
9918 Amat[0][2][2][2]=v[307];
9919 Amat[1][0][0][0]=v[287];
9920 Amat[1][0][0][1]=v[295];
9921 Amat[1][0][0][2]=v[302];
9922 Amat[1][0][1][0]=2e0*F[1][0]*v[169]+F[1][2]*v[224]+F[1][1]*v[261]+v[308];
9923 Amat[1][0][1][1]=v[310];
9924 Amat[1][0][1][2]=v[311];
9925 Amat[1][0][2][0]=v[312];
9926 Amat[1][0][2][1]=v[313];
9927 Amat[1][0][2][2]=v[314];
9928 Amat[1][1][0][0]=v[288];
9929 Amat[1][1][0][1]=v[296];
9930 Amat[1][1][0][2]=v[303];
9931 Amat[1][1][1][0]=v[310];
9932 Amat[1][1][1][1]=2e0*F[1][1]*v[157]+F[1][2]*v[194]+F[1][0]*v[265]+v[315];
9933 Amat[1][1][1][2]=v[317];
9934 Amat[1][1][2][0]=v[318];
9935 Amat[1][1][2][1]=v[319];
9936 Amat[1][1][2][2]=v[320];
9937 Amat[1][2][0][0]=v[289];
9938 Amat[1][2][0][1]=v[297];
9939 Amat[1][2][0][2]=v[304];
9940 Amat[1][2][1][0]=v[311];
9941 Amat[1][2][1][1]=v[317];
9942 Amat[1][2][1][2]=2e0*F[1][2]*v[146]+F[1][1]*v[198]+F[1][0]*v[231]+v[321];
9943 Amat[1][2][2][0]=v[323];
9944 Amat[1][2][2][1]=v[324];
9945 Amat[1][2][2][2]=v[325];
9946 Amat[2][0][0][0]=v[290];
9947 Amat[2][0][0][1]=v[298];
9948 Amat[2][0][0][2]=v[305];
9949 Amat[2][0][1][0]=v[312];
9950 Amat[2][0][1][1]=v[318];
9951 Amat[2][0][1][2]=v[323];
9952 Amat[2][0][2][0]=2e0*F[2][0]*v[174]+F[2][2]*v[235]+F[2][1]*v[274]+v[308];
9953 Amat[2][0][2][1]=v[327];
9954 Amat[2][0][2][2]=v[328];
9955 Amat[2][1][0][0]=v[291];
9956 Amat[2][1][0][1]=v[299];
9957 Amat[2][1][0][2]=v[306];
9958 Amat[2][1][1][0]=v[313];
9959 Amat[2][1][1][1]=v[319];
9960 Amat[2][1][1][2]=v[324];
9961 Amat[2][1][2][0]=v[327];
9962 Amat[2][1][2][1]=2e0*F[2][1]*v[161]+F[2][2]*v[203]+F[2][0]*v[278]+v[315];
9963 Amat[2][1][2][2]=v[330];
9964 Amat[2][2][0][0]=v[292];
9965 Amat[2][2][0][1]=v[300];
9966 Amat[2][2][0][2]=v[307];
9967 Amat[2][2][1][0]=v[314];
9968 Amat[2][2][1][1]=v[320];
9969 Amat[2][2][1][2]=v[325];
9970 Amat[2][2][2][0]=v[328];
9971 Amat[2][2][2][1]=v[330];
9972 Amat[2][2][2][2]=2e0*F[2][2]*v[149]+F[2][1]*v[207]+F[2][0]*v[242]+v[321];
9989template <
class SC,
class LO,
class GO,
class NO>
9990void FE<SC,LO,GO,NO>::stvk3d(
double* v,
double (*lam),
double (*mue),
double** F
9991 ,
double** Pmat,
double**** Amat)
9993 v[169]=Power(F[0][0],2);
9995 v[167]=Power(F[0][2],2);
9996 v[166]=F[2][2]*(*mue);
9997 v[165]=F[2][1]*(*mue);
9998 v[164]=F[2][0]*(*mue);
9999 v[163]=F[1][2]*(*mue);
10000 v[162]=F[1][1]*(*mue);
10001 v[161]=F[1][0]*(*mue);
10002 v[88]=F[0][0]*(*mue);
10003 v[116]=F[0][0]*v[88];
10004 v[70]=F[0][1]*(*lam);
10005 v[93]=F[0][1]*(*mue);
10006 v[117]=F[0][1]*v[93];
10007 v[71]=F[0][2]*(*lam);
10008 v[105]=(*mue)*v[167];
10009 v[72]=F[1][0]*(*lam);
10010 v[85]=2e0*v[161]+v[72];
10011 v[142]=F[1][0]*v[161];
10012 v[121]=F[0][0]*v[161];
10013 v[73]=F[1][1]*(*lam);
10014 v[100]=F[0][1]*v[161]+F[0][0]*v[73];
10015 v[82]=2e0*v[162]+v[73];
10016 v[143]=F[1][1]*v[162];
10017 v[122]=F[0][1]*v[162];
10018 v[108]=F[0][0]*v[162]+F[0][1]*v[72];
10019 v[74]=F[1][2]*(*lam);
10020 v[111]=F[0][2]*v[162]+F[0][1]*v[74];
10021 v[101]=F[0][2]*v[161]+F[0][0]*v[74];
10022 v[79]=2e0*v[163]+v[74];
10023 v[123]=v[121]+v[122]+F[0][2]*v[79];
10024 v[135]=F[1][2]*v[163];
10025 v[120]=F[0][1]*v[163]+F[0][2]*v[73];
10026 v[119]=F[0][0]*v[163]+F[0][2]*v[72];
10027 v[109]=F[0][2]*v[163];
10028 v[110]=v[109]+v[121]+F[0][1]*v[82];
10029 v[99]=v[109]+v[122]+F[0][0]*v[85];
10030 v[75]=F[2][0]*(*lam);
10031 v[86]=2e0*v[164]+v[75];
10032 v[156]=F[2][0]*v[164];
10033 v[147]=F[1][0]*v[164];
10034 v[126]=F[0][0]*v[164];
10035 v[76]=F[2][1]*(*lam);
10036 v[133]=F[1][1]*v[164]+F[1][0]*v[76];
10037 v[103]=F[0][1]*v[164]+F[0][0]*v[76];
10038 v[83]=2e0*v[165]+v[76];
10039 v[157]=F[2][1]*v[165];
10040 v[148]=F[1][1]*v[165];
10041 v[138]=F[1][0]*v[165]+F[1][1]*v[75];
10042 v[127]=F[0][1]*v[165];
10043 v[112]=F[0][0]*v[165]+F[0][1]*v[75];
10044 v[77]=F[2][2]*(*lam);
10045 v[141]=F[1][2]*v[165]+F[1][1]*v[77];
10046 v[134]=F[1][2]*v[164]+F[1][0]*v[77];
10047 v[115]=F[0][2]*v[165]+F[0][1]*v[77];
10048 v[104]=F[0][2]*v[164]+F[0][0]*v[77];
10049 v[80]=2e0*v[166]+v[77];
10050 v[149]=v[147]+v[148]+F[1][2]*v[80];
10051 v[128]=v[126]+v[127]+F[0][2]*v[80];
10052 v[153]=F[2][2]*v[166];
10053 v[146]=F[1][1]*v[166]+F[1][2]*v[76];
10054 v[145]=F[1][0]*v[166]+F[1][2]*v[75];
10055 v[139]=F[1][2]*v[166];
10056 v[140]=v[139]+v[147]+F[1][1]*v[83];
10057 v[132]=v[139]+v[148]+F[1][0]*v[86];
10058 v[125]=F[0][1]*v[166]+F[0][2]*v[76];
10059 v[124]=F[0][0]*v[166]+F[0][2]*v[75];
10060 v[113]=F[0][2]*v[166];
10061 v[114]=v[113]+v[126]+F[0][1]*v[83];
10062 v[102]=v[113]+v[127]+F[0][0]*v[86];
10063 v[24]=(-1e0+Power(F[1][0],2)+Power(F[2][0],2)+v[169])/2e0;
10064 v[28]=(-1e0+Power(F[0][1],2)+Power(F[1][1],2)+Power(F[2][1],2))/2e0;
10065 v[32]=(-1e0+Power(F[1][2],2)+Power(F[2][2],2)+v[167])/2e0;
10066 v[36]=(*lam)*(v[24]+v[28]+v[32]);
10067 v[35]=2e0*(*mue)*v[32]+v[36];
10068 v[37]=2e0*(*mue)*v[28]+v[36];
10069 v[38]=2e0*(*mue)*v[24]+v[36];
10070 v[39]=(F[0][0]*F[0][2]+F[1][0]*F[1][2]+F[2][0]*F[2][2])*(*mue);
10071 v[152]=F[2][2]*v[164]+v[39]+F[2][0]*v[77];
10072 v[131]=F[1][2]*v[161]+v[39]+F[1][0]*v[74];
10073 v[98]=v[39]+F[0][0]*v[71]+F[0][2]*v[88];
10074 v[40]=(F[0][1]*F[0][2]+F[1][1]*F[1][2]+F[2][1]*F[2][2])*(*mue);
10075 v[155]=F[2][2]*v[165]+v[40]+F[2][1]*v[77];
10076 v[137]=F[1][2]*v[162]+v[40]+F[1][1]*v[74];
10077 v[107]=v[40]+F[0][1]*v[71]+F[0][2]*v[93];
10078 v[41]=(F[0][0]*F[0][1]+F[1][0]*F[1][1]+F[2][0]*F[2][1])*(*mue);
10079 v[151]=F[2][1]*v[164]+v[41]+F[2][0]*v[76];
10080 v[130]=F[1][1]*v[161]+v[41]+F[1][0]*v[73];
10081 v[97]=v[41]+F[0][0]*v[70]+F[0][1]*v[88];
10082 Pmat[0][0]=F[0][0]*v[38]+F[0][2]*v[39]+F[0][1]*v[41];
10083 Pmat[0][1]=F[0][1]*v[37]+F[0][2]*v[40]+F[0][0]*v[41];
10084 Pmat[0][2]=F[0][2]*v[35]+F[0][0]*v[39]+F[0][1]*v[40];
10085 Pmat[1][0]=F[1][0]*v[38]+F[1][2]*v[39]+F[1][1]*v[41];
10086 Pmat[1][1]=F[1][1]*v[37]+F[1][2]*v[40]+F[1][0]*v[41];
10087 Pmat[1][2]=F[1][2]*v[35]+F[1][0]*v[39]+F[1][1]*v[40];
10088 Pmat[2][0]=F[2][0]*v[38]+F[2][2]*v[39]+F[2][1]*v[41];
10089 Pmat[2][1]=F[2][1]*v[37]+F[2][2]*v[40]+F[2][0]*v[41];
10090 Pmat[2][2]=F[2][2]*v[35]+F[2][0]*v[39]+F[2][1]*v[40];
10091 Amat[0][0][0][0]=v[105]+v[117]+((*lam)+v[168])*v[169]+v[38];
10092 Amat[0][0][0][1]=v[97];
10093 Amat[0][0][0][2]=v[98];
10094 Amat[0][0][1][0]=v[99];
10095 Amat[0][0][1][1]=v[100];
10096 Amat[0][0][1][2]=v[101];
10097 Amat[0][0][2][0]=v[102];
10098 Amat[0][0][2][1]=v[103];
10099 Amat[0][0][2][2]=v[104];
10100 Amat[0][1][0][0]=v[97];
10101 Amat[0][1][0][1]=v[105]+v[116]+v[37]+F[0][1]*(v[70]+2e0*v[93]);
10102 Amat[0][1][0][2]=v[107];
10103 Amat[0][1][1][0]=v[108];
10104 Amat[0][1][1][1]=v[110];
10105 Amat[0][1][1][2]=v[111];
10106 Amat[0][1][2][0]=v[112];
10107 Amat[0][1][2][1]=v[114];
10108 Amat[0][1][2][2]=v[115];
10109 Amat[0][2][0][0]=v[98];
10110 Amat[0][2][0][1]=v[107];
10111 Amat[0][2][0][2]=v[116]+v[117]+v[35]+F[0][2]*(F[0][2]*v[168]+v[71]);
10112 Amat[0][2][1][0]=v[119];
10113 Amat[0][2][1][1]=v[120];
10114 Amat[0][2][1][2]=v[123];
10115 Amat[0][2][2][0]=v[124];
10116 Amat[0][2][2][1]=v[125];
10117 Amat[0][2][2][2]=v[128];
10118 Amat[1][0][0][0]=v[99];
10119 Amat[1][0][0][1]=v[108];
10120 Amat[1][0][0][2]=v[119];
10121 Amat[1][0][1][0]=v[135]+v[143]+v[38]+F[1][0]*v[85];
10122 Amat[1][0][1][1]=v[130];
10123 Amat[1][0][1][2]=v[131];
10124 Amat[1][0][2][0]=v[132];
10125 Amat[1][0][2][1]=v[133];
10126 Amat[1][0][2][2]=v[134];
10127 Amat[1][1][0][0]=v[100];
10128 Amat[1][1][0][1]=v[110];
10129 Amat[1][1][0][2]=v[120];
10130 Amat[1][1][1][0]=v[130];
10131 Amat[1][1][1][1]=v[135]+v[142]+v[37]+F[1][1]*v[82];
10132 Amat[1][1][1][2]=v[137];
10133 Amat[1][1][2][0]=v[138];
10134 Amat[1][1][2][1]=v[140];
10135 Amat[1][1][2][2]=v[141];
10136 Amat[1][2][0][0]=v[101];
10137 Amat[1][2][0][1]=v[111];
10138 Amat[1][2][0][2]=v[123];
10139 Amat[1][2][1][0]=v[131];
10140 Amat[1][2][1][1]=v[137];
10141 Amat[1][2][1][2]=v[142]+v[143]+v[35]+F[1][2]*v[79];
10142 Amat[1][2][2][0]=v[145];
10143 Amat[1][2][2][1]=v[146];
10144 Amat[1][2][2][2]=v[149];
10145 Amat[2][0][0][0]=v[102];
10146 Amat[2][0][0][1]=v[112];
10147 Amat[2][0][0][2]=v[124];
10148 Amat[2][0][1][0]=v[132];
10149 Amat[2][0][1][1]=v[138];
10150 Amat[2][0][1][2]=v[145];
10151 Amat[2][0][2][0]=v[153]+v[157]+v[38]+F[2][0]*v[86];
10152 Amat[2][0][2][1]=v[151];
10153 Amat[2][0][2][2]=v[152];
10154 Amat[2][1][0][0]=v[103];
10155 Amat[2][1][0][1]=v[114];
10156 Amat[2][1][0][2]=v[125];
10157 Amat[2][1][1][0]=v[133];
10158 Amat[2][1][1][1]=v[140];
10159 Amat[2][1][1][2]=v[146];
10160 Amat[2][1][2][0]=v[151];
10161 Amat[2][1][2][1]=v[153]+v[156]+v[37]+F[2][1]*v[83];
10162 Amat[2][1][2][2]=v[155];
10163 Amat[2][2][0][0]=v[104];
10164 Amat[2][2][0][1]=v[115];
10165 Amat[2][2][0][2]=v[128];
10166 Amat[2][2][1][0]=v[134];
10167 Amat[2][2][1][1]=v[141];
10168 Amat[2][2][1][2]=v[149];
10169 Amat[2][2][2][0]=v[152];
10170 Amat[2][2][2][1]=v[155];
10171 Amat[2][2][2][2]=v[156]+v[157]+v[35]+F[2][2]*v[80];
10187template <
class SC,
class LO,
class GO,
class NO>
10188void FE<SC,LO,GO,NO>::stvk2d(
double* v,
double (*lam),
double (*mue),
double** F
10189 ,
double** Pmat,
double**** Amat)
10191 v[43]=F[0][0]*F[1][0];
10192 v[42]=F[0][1]*F[1][1];
10193 v[37]=Power(F[0][0],2);
10195 v[36]=Power(F[0][1],2);
10196 v[34]=F[0][0]*F[0][1];
10198 v[27]=Power(F[1][0],2);
10199 v[31]=-1e0+v[27]+v[37];
10201 v[25]=Power(F[1][1],2);
10202 v[26]=-1e0+v[25]+v[36];
10203 v[23]=F[1][0]*F[1][1];
10205 v[35]=(*lam)*v[34]+(*mue)*(v[22]+v[34]);
10206 v[24]=(*lam)*v[23]+(*mue)*(v[22]+v[23]);
10207 v[21]=(*lam)*v[42]+2e0*(*mue)*(2e0*v[12]*v[14]+v[42]);
10208 v[20]=F[0][0]*F[1][1]*(*lam)+4e0*(*mue)*v[11]*v[14];
10210 v[30]=F[0][1]*F[1][0]*(*lam)+4e0*(*mue)*v[12]*v[13];
10211 v[29]=(*lam)*v[43]+2e0*(*mue)*(2e0*v[11]*v[13]+v[43]);
10213 v[32]=((*lam)*(v[26]+v[31]))/2e0;
10214 Pmat[0][0]=F[0][0]*v[32]+(*mue)*(F[0][0]*v[31]+v[11]*v[44]);
10215 Pmat[0][1]=F[0][1]*v[32]+(*mue)*(F[0][1]*v[26]+v[12]*v[44]);
10216 Pmat[1][0]=F[1][0]*v[32]+(*mue)*(F[1][0]*v[31]+v[13]*v[44]);
10217 Pmat[1][1]=F[1][1]*v[32]+(*mue)*(F[1][1]*v[26]+v[14]*v[44]);
10218 Amat[0][0][0][0]=v[32]+(*lam)*v[37]+(*mue)*(v[31]+v[36]+2e0*v[37]);
10219 Amat[0][0][0][1]=v[35];
10220 Amat[0][0][1][0]=v[29];
10221 Amat[0][0][1][1]=v[20];
10222 Amat[0][1][0][0]=v[35];
10223 Amat[0][1][0][1]=v[32]+(*lam)*v[36]+(*mue)*(v[26]+2e0*v[36]+v[37]);
10224 Amat[0][1][1][0]=v[30];
10225 Amat[0][1][1][1]=v[21];
10226 Amat[1][0][0][0]=v[29];
10227 Amat[1][0][0][1]=v[30];
10228 Amat[1][0][1][0]=(*lam)*v[27]+(*mue)*(v[25]+2e0*v[27]+v[31])+v[32];
10229 Amat[1][0][1][1]=v[24];
10230 Amat[1][1][0][0]=v[20];
10231 Amat[1][1][0][1]=v[21];
10232 Amat[1][1][1][0]=v[24];
10233 Amat[1][1][1][1]=(*lam)*v[25]+(*mue)*(2e0*v[25]+v[26]+v[27])+v[32];
10249template <
class SC,
class LO,
class GO,
class NO>
10250void FE<SC,LO,GO,NO>::SMTSetElSpecBiot(
ElementSpec *es,
int *idata,
int ic,
int ng, vec_dbl_Type& paraVec)
10252 int dim = domainVec_[0]->getDimension();
10253 int intc,nd,i;FILE *SMSFile;
10254 static int pn[24]={1, 4, 2, 5, 3, 6, 0, 1, 4, 6, -1, 4, 2, 5, -1, 6, 4, 5, -1, 6, 5, 3, -1, 0};
10255 static int dof[9]={2, 2, 2, 2, 2, 2, 1, 1, 1};
10256 static int nsto[9]={0, 0, 0, 0, 0, 0, 0, 0, 0};
10258 static int ndat[9]={0, 0, 0, 0, 0, 0, 0, 0, 0};
10260 static char *nid[]={
"D",
"D",
"D",
"D",
"D",
"D",
10265 static char *gdcs[]={
"$[Gamma]$NM -Newmark Parameter",
10266 "$[Beta]$NM -Newmark Parameter",
10267 "ns0s -initial volume fraction solid",
10268 "kL -Darcy parameter",
10269 "E -Youngs modulus",
10270 "$[Nu]$ -Poissons Ratio"};
10280 static char *gpcs[]={
""};
10281 static char *npcs[]={
"p",
"u1",
"u2",
"u3",
"$[Sigma]$11",
"$[Sigma]$22",
10282 "$[Sigma]$33",
"$[Sigma]$12",
"$[Sigma]$23",
"$[Sigma]$31",
"seepage1",
"seepage2"};
10283 static char *sname[]={
""};
10284 static char *idname[]={
""};
10285 static int idindex[1];
10286 static char *rdname[]={
""};
10287 static char *cswitch[]={
""};
10288 static int iswitch[1]={0};
10289 static double dswitch[1]={0e0};
10290 static int rdindex[1];
10291 static int nspecs[9];
10292 static double version[3]={6.818,6.818,11.1};
10293 static double pnweights[9]={1e0,1e0,1e0,1e0,1e0,1e0,
10296 static double rnodes[27]={ 1e0,0e0,0e0,
10306 es->ReferenceNodes=rnodes;
10307 if(ng==-1) es->Data= ¶Vec[0];
10308 es->id.NoDomainData=6;
10309 es->Code=
"T2_TPM_up_LE_Iso_Gal";
10310 es->Version=version;
10313 es->SubSubTitle=
"";
10314 es->Bibliography=
"";
10316 es->id.NoDimensions = dim ;
10317 es->id.NoDOFGlobal=15;
10318 es->id.NoDOFCondense=0;
10320 es->id.NoSegmentPoints=23;
10322 es->PostNodeWeights=pnweights;
10323 es->id.NoIntSwitch=0;
10324 es->IntSwitch=iswitch;
10325 es->id.DemoLimitation=0;
10326 es->id.NoDoubleSwitch=0;
10327 es->DoubleSwitch=dswitch;
10328 es->id.NoCharSwitch=0;
10329 es->CharSwitch=cswitch;
10332 es->id.NoGPostData=0;
10333 es->id.NoNPostData=12;
10334 es->id.SymmetricTangent=0;
10335 es->id.CreateDummyNodes=0;
10336 es->id.PostIterationCall=0;
10337 es->id.DOFScaling=0;
10339 es->DomainDataNames=gdcs;
10340 es->GPostNames=gpcs;
10341 es->NPostNames=npcs;
10342 es->AdditionalNodes=
"{}&";
10343 es->AdditionalGraphics=
"{}&";
10344 es->MMAInitialisation=MMAInitialisationCode;
10345 es->MMANextStep=
"";
10346 es->MMAStepBack=
"";
10347 es->MMAPreIteration=
"";
10348 es->IDataNames=idname;
10349 es->IDataIndex=idindex;
10350 es->RDataNames=rdname;
10351 es->RDataIndex=rdindex;
10354 es->id.ShapeSensitivity=0;
10355 es->id.EBCSensitivity=0;
10356 es->id.SensitivityOrder=0;
10357 es->id.NoSensNames=0;
10358 es->SensitivityNames=sname;
10359 es->NodeSpecs=nspecs;
10363 es->id.DefaultIntegrationCode=35;
10364 if(ic==-1){intc=35;}
else {intc=ic;};
10365 es->id.IntCode=intc;
10367 es->IntPoints = SMTMultiIntPoints(&intc,idata,&es->id.NoIntPoints,
10368 &es->id.NoIntPointsA,&es->id.NoIntPointsB,&es->id.NoIntPointsC,1);
10369 es->id.NoAdditionalData=(int)(0);
10371 es->id.NoTimeStorage=(int)(24);
10372 es->id.NoElementData=(int)(0);
10374 es->NoNodeStorage=nsto;es->NoNodeData=ndat;
10378template <
class SC,
class LO,
class GO,
class NO>
10379void FE<SC,LO,GO,NO>::SMTSetElSpecBiotStVK(
ElementSpec *es,
int *idata,
int ic,
int ng, vec_dbl_Type& paraVec)
10382 int intc,nd,i;FILE *SMSFile;
10384 static int pn[9]={1, 2, 3, 0, 1, 2, 3, -1, 0};
10385 static int dof[9]={2, 2, 2, 2, 2, 2, 1, 1, 1};
10386 static int nsto[9]={0, 0, 0, 0, 0, 0, 0, 0, 0};
10388 static int ndat[9]={0, 0, 0, 0, 0, 0, 0, 0, 0};
10390 static char *nid[]={
"D",
"D",
"D",
"D",
"D",
"D",
10392 static char *gdcs[]={
"E -Youngs modulus",
10393 "$[Nu]$ -Poissons Ratio",
10394 "ns0s -initial volume fraction solid",
10395 "kL -Darcy parameter",
10396 "$[Gamma]$NM -Newmark Parameter",
10397 "$[Beta]$NM -Newmark Parameter"};
10399 static char *gpcs[]={
"p",
"u1",
"u2",
"u3",
"$[Sigma]$11",
"$[Sigma]$22",
10400 "$[Sigma]$33",
"$[Sigma]$12",
"$[Sigma]$23",
"$[Sigma]$31",
"seepage1",
"seepage2"};
10401 static char *npcs[]={
""};
10402 static char *sname[]={
""};
10403 static char *idname[]={
""};
10404 static int idindex[1];
10405 static char *rdname[]={
""};
10406 static char *cswitch[]={
""};
10407 static int iswitch[1]={0};
10408 static double dswitch[1]={0e0};
10409 static int rdindex[1];
10410 static int nspecs[9];
10411 static double version[3]={6.818,6.818,11.1};
10412 static double pnweights[9]={1e0,1e0,1e0,0e0,0e0,0e0,
10414 static double rnodes[27]={1e0,0e0,0e0,0e0,1e0,0e0,
10415 0e0,0e0,0e0,0.5e0,0e0,0e0,
10416 0.5e0,0.5e0,0e0,0e0,0.5e0,0e0,
10417 1e0,0e0,0e0,0e0,1e0,0e0,
10419 es->ReferenceNodes=rnodes;
10420 if(ng==-1) es->Data= ¶Vec[0];
10421 es->id.NoDomainData=6;
10422 es->Code=
"T2T1_up_nichtlinear_iso_gal_2020_02_05";es->Version=version;
10425 es->SubSubTitle=
"";
10426 es->Bibliography=
"";
10427 es->id.NoDimensions=2;es->id.NoDOFGlobal=15;es->id.NoDOFCondense=0;es->id.NoNodes=9;
10428 es->id.NoSegmentPoints=8;es->Segments=pn;es->PostNodeWeights=pnweights;
10429 es->id.NoIntSwitch=0;es->IntSwitch=iswitch;es->id.DemoLimitation=0;
10430 es->id.NoDoubleSwitch=0;es->DoubleSwitch=dswitch;
10431 es->id.NoCharSwitch=0;es->CharSwitch=cswitch;
10432 es->DOFGlobal=dof;es->NodeID=nid;es->id.NoGPostData=12;es->id.NoNPostData=0;
10433 es->id.SymmetricTangent=0;es->id.CreateDummyNodes=0;es->id.PostIterationCall=0;es->id.DOFScaling=0;
10434 es->Topology=
"XX";es->DomainDataNames=gdcs;es->GPostNames=gpcs;es->NPostNames=npcs;
10435 es->AdditionalNodes=
"{}&";
10436 es->AdditionalGraphics=
"{}&";
10437 es->MMAInitialisation=MMAInitialisationCode;
10438 es->MMANextStep=
"";
10439 es->MMAStepBack=
"";
10440 es->MMAPreIteration=
"";
10441 es->IDataNames=idname;es->IDataIndex=idindex;es->RDataNames=rdname;es->RDataIndex=rdindex;
10442 es->id.NoIData=0;es->id.NoRData=0;
10443 es->id.ShapeSensitivity=0; es->id.EBCSensitivity=0;es->id.SensitivityOrder=0;
10444 es->id.NoSensNames=0;es->SensitivityNames=sname;es->NodeSpecs=nspecs;
10448 es->id.DefaultIntegrationCode=35;
10449 if(ic==-1){intc=35;}
else {intc=ic;};
10450 es->id.IntCode=intc;
10451 es->IntPoints = SMTMultiIntPoints(&intc,idata,&es->id.NoIntPoints,
10452 &es->id.NoIntPointsA,&es->id.NoIntPointsB,&es->id.NoIntPointsC,1);
10454 es->id.NoAdditionalData=(int)(0);
10455 es->id.NoTimeStorage=(int)(24);
10456 es->id.NoElementData=(int)(0);
10458 es->NoNodeStorage=nsto;es->NoNodeData=ndat;
10475template <
class SC,
class LO,
class GO,
class NO>
10476void FE<SC,LO,GO,NO>::SMTSetElSpecBiot3D(
ElementSpec *es,
int *idata,
int ic,
int ng, vec_dbl_Type& paraVec)
10478 int intc,nd,i;FILE *SMSFile;
10479 static int pn[33]={1, 2, 4, 0, 1, 4, 3, 0, 1, 2, 3, 0, 2, 3, 4, 0, 1, 2, 4, -1, 1, 4, 3, -2, 1, 2, 3, -3, 2, 3, 4, -4, 0};
10480 static int dof[14]={3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1};
10481 static int nsto[14]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
10483 static int ndat[14]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
10487 static char *nid[]={
"D",
"D",
"D",
"D",
"D",
"D",
10488 "D",
"D",
"D",
"D",
"p",
"p",
10490 static char *gdcs[]={
"E -Youngs modulus",
"$[Nu]$ -Poissons Ratio",
"bx -body force",
"by -body force",
"bz -body force",
"ns0s -initial volume fraction solid",
10491 "kL -Darcy parameter",
"$[Rho]$SR -effective density solid",
"$[Rho]$FR -effective density solid",
"g -gravity",
"$[Gamma]$NM -Newmark Parameter",
"$[Beta]$NM -Newmark Parameter"};
10492 static double defd[]={200e0,0e0,0e0,0e0,0e0,0.67e0,
10493 0.1e-3,2000e0,1000e0,0.9810000000000001e1,0.5e0,0.25e0,
10495 static char *gpcs[]={
"p",
"u1",
"u2",
"u3",
"$[Sigma]$11",
"$[Sigma]$22",
10496 "$[Sigma]$33",
"$[Sigma]$12",
"$[Sigma]$23",
"$[Sigma]$31",
"seepage1",
"seepage2",
10498 static char *npcs[]={
""};
10499 static char *sname[]={
""};
10500 static char *idname[]={
""};
10501 static int idindex[1];
10502 static char *rdname[]={
""};
10503 static char *cswitch[]={
""};
10504 static int iswitch[1]={0};
10505 static double dswitch[1]={0e0};
10506 static int rdindex[1];
10507 static int nspecs[14];
10508 static double version[3]={7.114,7.114,11.1};
10509 static double pnweights[14]={1e0,1e0,1e0,1e0,0e0,0e0,
10510 0e0,0e0,0e0,0e0,0e0,0e0,
10512 static double rnodes[42]={1e0,0e0,0e0,0e0,1e0,0e0,
10513 0e0,0e0,1e0,0e0,0e0,0e0,
10514 0.5e0,0.5e0,0e0,0e0,0.5e0,0.5e0,
10515 0.5e0,0e0,0.5e0,0.5e0,0e0,0e0,
10516 0e0,0.5e0,0e0,0e0,0e0,0.5e0,
10517 1e0,0e0,0e0,0e0,1e0,0e0,
10518 0e0,0e0,1e0,0e0,0e0,0e0};
10519 es->ReferenceNodes=rnodes;
10522 es->Data=¶Vec[0];
10524 es->id.NoDomainData=12;
10525 es->Code=
"O2O1_up_lin_el_iso_gal_Newmark_mesh_koeln_1D_Ehlers_2020_09_04";es->Version=version;
10528 es->SubSubTitle=
"";
10529 es->Bibliography=
"";
10530 es->id.NoDimensions=3;es->id.NoDOFGlobal=34;es->id.NoDOFCondense=0;es->id.NoNodes=14;
10531 es->id.NoSegmentPoints=32;es->Segments=pn;es->PostNodeWeights=pnweights;
10532 es->id.NoIntSwitch=0;es->IntSwitch=iswitch;
10534 es->id.NoDoubleSwitch=0;es->DoubleSwitch=dswitch;
10535 es->id.NoCharSwitch=0;es->id.WorkingVectorSize=1817;es->CharSwitch=cswitch;
10536 es->DOFGlobal=dof;es->NodeID=nid;es->id.NoGPostData=13;es->id.NoNPostData=0;
10537 es->id.SymmetricTangent=0;es->id.PostIterationCall=0;es->id.DOFScaling=0;
10538 es->Topology=
"XX";es->DomainDataNames=gdcs;es->GPostNames=gpcs;es->NPostNames=npcs;
10539 es->AdditionalNodes=
"{}&";
10540 es->AdditionalGraphics=
"{Null,Null,Null}";
10541 es->MMAInitialisation=MMAInitialisationCode;
10542 es->MMANextStep=
"";
10543 es->MMAStepBack=
"";
10544 es->MMAPreIteration=
"";
10545 es->IDataNames=idname;es->IDataIndex=idindex;es->RDataNames=rdname;es->RDataIndex=rdindex;
10546 es->id.NoIData=0;es->id.NoRData=0;
10547 es->id.ShapeSensitivity=0; es->id.EBCSensitivity=0;es->id.SensitivityOrder=0;
10548 es->id.NoSensNames=0;es->SensitivityNames=sname;es->NodeSpecs=nspecs;
10552 es->id.DefaultIntegrationCode=40;
10553 if(ic==-1){intc=40;}
else {intc=ic;};
10554 es->id.IntCode=intc;
10555 es->IntPoints = SMTMultiIntPoints(&intc,idata,&es->id.NoIntPoints,
10556 &es->id.NoIntPointsA,&es->id.NoIntPointsB,&es->id.NoIntPointsC,1);
10557 es->id.NoAdditionalData=(int)(0);
10558 es->id.NoTimeStorage=(int)(60);
10559 es->id.NoElementData=(int)(0);
10562 es->NoNodeStorage=nsto;es->NoNodeData=ndat;
10570template <
class SC,
class LO,
class GO,
class NO>
10572 ,
NodeData **nd,
double *rdata,
int *idata,
double *p,
double **s)
10574 int i107,i109,i215,i230;
10667 v[191]=es->Data[5];
10668 v[194]=es->Data[4]/(2e0*(1e0+v[191]));
10669 v[192]=(2e0*v[191]*v[194])/(1e0-2e0*v[191]);
10670 v[186]=es->Data[3];
10671 v[183]=es->Data[2];
10687 v[19]=nd[0]->at[0];
10688 v[20]=nd[0]->at[1];
10689 v[21]=nd[1]->at[0];
10690 v[22]=nd[1]->at[1];
10691 v[23]=nd[2]->at[0];
10692 v[24]=nd[2]->at[1];
10693 v[25]=nd[3]->at[0];
10694 v[26]=nd[3]->at[1];
10695 v[27]=nd[4]->at[0];
10696 v[28]=nd[4]->at[1];
10697 v[29]=nd[5]->at[0];
10698 v[30]=nd[5]->at[1];
10699 v[31]=nd[6]->at[0];
10700 v[32]=nd[7]->at[0];
10701 v[33]=nd[8]->at[0];
10702 v[172]=v[32]-v[33];
10703 v[171]=v[31]-v[33];
10705 v[490]=-nd[0]->ap[0]+v[19];
10706 v[497]=-nd[0]->ap[1]+v[20];
10707 v[492]=-nd[1]->ap[0]+v[21];
10708 v[498]=-nd[1]->ap[1]+v[22];
10709 v[493]=-nd[2]->ap[0]+v[23];
10710 v[499]=-nd[2]->ap[1]+v[24];
10711 v[494]=-nd[3]->ap[0]+v[25];
10712 v[500]=-nd[3]->ap[1]+v[26];
10713 v[495]=-nd[4]->ap[0]+v[27];
10714 v[501]=-nd[4]->ap[1]+v[28];
10715 v[496]=-nd[5]->ap[0]+v[29];
10716 v[488]=-nd[5]->ap[1]+v[30];
10718 v[49]=rdata[RD_TimeIncrement];
10745 v[489]=1e0/(Power(v[49],2)*v[75]);
10746 v[491]=-((v[49]*v[49])*(0.5e0-v[75]));
10747 v[79]=es->Data[0]/(v[49]*v[75]);
10748 v[486]=-(v[49]*v[79]);
10749 v[487]=(1e0+v[486]/2e0)*v[49];
10751 v[76]=v[487]*v[62]+v[50]*v[77]+v[490]*v[79];
10752 v[80]=v[487]*v[68]+v[56]*v[77]+v[497]*v[79];
10753 v[81]=v[487]*v[63]+v[51]*v[77]+v[492]*v[79];
10754 v[82]=v[487]*v[69]+v[57]*v[77]+v[498]*v[79];
10755 v[83]=v[487]*v[64]+v[52]*v[77]+v[493]*v[79];
10756 v[84]=v[487]*v[70]+v[58]*v[77]+v[499]*v[79];
10757 v[85]=v[487]*v[65]+v[53]*v[77]+v[494]*v[79];
10758 v[86]=v[487]*v[71]+v[59]*v[77]+v[500]*v[79];
10759 v[87]=v[487]*v[66]+v[54]*v[77]+v[495]*v[79];
10760 v[88]=v[487]*v[72]+v[60]*v[77]+v[501]*v[79];
10761 v[89]=v[487]*v[67]+v[55]*v[77]+v[496]*v[79];
10762 v[90]=v[487]*v[73]+v[61]*v[77]+v[488]*v[79];
10776 ed->ht[12]=v[489]*(v[490]-v[49]*v[50]+v[491]*v[62]);
10777 ed->ht[13]=v[489]*(v[492]-v[49]*v[51]+v[491]*v[63]);
10778 ed->ht[14]=v[489]*(v[493]-v[49]*v[52]+v[491]*v[64]);
10779 ed->ht[15]=v[489]*(v[494]-v[49]*v[53]+v[491]*v[65]);
10780 ed->ht[16]=v[489]*(v[495]-v[49]*v[54]+v[491]*v[66]);
10781 ed->ht[17]=v[489]*(v[496]-v[49]*v[55]+v[491]*v[67]);
10782 ed->ht[18]=v[489]*(v[497]-v[49]*v[56]+v[491]*v[68]);
10783 ed->ht[19]=v[489]*(v[498]-v[49]*v[57]+v[491]*v[69]);
10784 ed->ht[20]=v[489]*(v[499]-v[49]*v[58]+v[491]*v[70]);
10785 ed->ht[21]=v[489]*(v[500]-v[49]*v[59]+v[491]*v[71]);
10786 ed->ht[22]=v[489]*(v[501]-v[49]*v[60]+v[491]*v[72]);
10787 ed->ht[23]=v[489]*(v[488]-v[49]*v[61]+v[491]*v[73]);
10789 for(i107=1;i107<=es->id.NoIntPoints;i107++){
10791 v[108]=es->IntPoints[i109];
10793 v[132]=-1e0+v[137];
10794 v[110]=es->IntPoints[1+i109];
10796 v[133]=-1e0+v[136];
10797 v[119]=-1e0+v[108]+v[110];
10813 v[139]=-4e0*v[119];
10814 v[140]=-v[137]+v[139];
10815 v[138]=-v[136]+v[139];
10816 v[135]=-1e0+2e0*v[108]+2e0*v[110]+2e0*v[119];
10877 v[164]=v[135]*v[84];
10878 v[161]=v[135]*v[83];
10879 v[153]=v[135]*v[24];
10880 v[154]=v[153]+v[133]*v[22]+v[138]*v[28]+v[137]*(v[26]-v[30]);
10881 v[152]=v[153]+v[132]*v[20]+v[136]*(v[26]-v[28])+v[140]*v[30];
10882 v[150]=v[135]*v[23];
10883 v[151]=v[150]+v[133]*v[21]+v[138]*v[27]+v[137]*(v[25]-v[29]);
10884 v[149]=v[150]+v[132]*v[19]+v[136]*(v[25]-v[27])+v[140]*v[29];
10885 v[145]=v[135]*v[6];
10886 v[146]=v[10]*v[138]+v[145]+v[133]*v[4]+v[137]*(-v[12]+v[8]);
10887 v[144]=v[12]*v[140]+v[145]+v[132]*v[2]+v[136]*(-v[10]+v[8]);
10888 v[142]=v[135]*v[5];
10889 v[143]=v[142]+v[133]*v[3]+v[137]*(-v[11]+v[7])+v[138]*v[9];
10890 v[141]=v[1]*v[132]+v[11]*v[140]+v[142]+v[136]*(v[7]-v[9]);
10891 v[155]=-(v[143]*v[144])+v[141]*v[146];
10892 v[525]=-(v[143]/v[155]);
10893 v[529]=v[140]*v[525];
10894 v[524]=v[141]/v[155];
10895 v[527]=v[138]*v[524];
10896 v[523]=v[146]/v[155];
10897 v[528]=v[140]*v[523];
10898 v[522]=-(v[144]/v[155]);
10899 v[526]=v[138]*v[522];
10900 v[519]=1e0/Power(v[155],2);
10901 v[503]=v[137]/v[155];
10902 v[502]=v[136]/v[155];
10903 v[267]=v[143]*v[502];
10904 v[266]=v[141]*v[503];
10905 v[263]=v[146]*v[502];
10906 v[262]=v[144]*v[503];
10907 v[148]=es->IntPoints[3+i109]*std::fabs(v[155]);
10908 v[176]=(v[146]*v[149]-v[144]*v[151])/v[155];
10909 v[179]=(-(v[143]*v[152])+v[141]*v[154])/v[155];
10910 v[195]=v[176]+v[179];
10911 v[505]=v[192]*v[195]-v[108]*v[31]-v[110]*v[32]+v[119]*v[33];
10912 v[185]=1e0-v[183]*(1e0+v[195]);
10913 v[504]=v[186]/(v[155]*v[185]);
10914 v[510]=v[185]*v[504];
10915 v[198]=-(((v[143]*v[149]-v[141]*v[151]-v[146]*v[152]+v[144]*v[154])*v[194])/v[155]);
10916 v[204]=2e0*v[176]*v[194]+v[505];
10917 v[205]=2e0*v[179]*v[194]+v[505];
10918 v[208]=(-(v[144]*(v[161]+v[133]*v[81]+v[137]*v[85]+v[138]*v[87]-v[137]*v[89]))+v[146]*(v[161]
10919 +v[132]*v[76]+v[136]*v[85]-v[136]*v[87]+v[140]*v[89])+v[141]*(v[164]+v[133]*v[82]+v[137]*v[86]
10920 +v[138]*v[88]-v[137]*v[90])-v[143]*(v[164]+v[132]*v[80]+v[136]*v[86]-v[136]*v[88]+v[140]*v[90]))
10922 v[210]=(-(v[146]*v[171])+v[144]*v[172])*v[185]*v[504];
10923 v[211]=(v[143]*v[171]-v[141]*v[172])*v[185]*v[504];
10924 v[217]=(v[146]*v[198]-v[143]*v[205])/v[155];
10925 v[225]=v[136]*v[217];
10926 v[218]=(-(v[144]*v[198])+v[141]*v[205])/v[155];
10927 v[226]=v[137]*v[218];
10928 v[219]=(-(v[143]*v[198])+v[146]*v[204])/v[155];
10929 v[223]=v[136]*v[219];
10930 v[220]=(v[141]*v[198]-v[144]*v[204])/v[155];
10931 v[224]=v[137]*v[220];
10932 v[221]=(v[146]*v[210]-v[143]*v[211])/v[155];
10933 v[222]=(-(v[144]*v[210])+v[141]*v[211])/v[155];
10934 v[5023]=v[132]*v[219];
10935 v[5024]=v[132]*v[217];
10936 v[5025]=v[133]*v[220];
10937 v[5026]=v[133]*v[218];
10938 v[5027]=v[135]*(v[219]+v[220]);
10939 v[5028]=v[135]*(v[217]+v[218]);
10940 v[5029]=v[223]+v[224];
10941 v[5030]=v[225]+v[226];
10942 v[5031]=v[138]*v[220]-v[223];
10943 v[5032]=v[138]*v[218]-v[225];
10944 v[5033]=v[140]*v[219]-v[224];
10945 v[5034]=v[140]*v[217]-v[226];
10946 v[5035]=-(v[108]*v[208])+v[221];
10947 v[5036]=-(v[110]*v[208])+v[222];
10948 v[5037]=v[119]*v[208]-v[221]-v[222];
10957 for(i215=1;i215<=15;i215++){
10958 v[233]=v[5041+i215];
10959 v[234]=v[5056+i215];
10960 v[509]=v[5191+i215]*v[79];
10961 v[261]=v[135]*v[509];
10962 v[260]=v[509]/v[155];
10963 v[246]=((v[141]*v[233]-v[143]*v[234])*v[510])/v[155];
10964 v[247]=((-(v[144]*v[233])+v[146]*v[234])*v[510])/v[155];
10965 v[238]=v[137]*v[5071+i215]+v[5086+i215];
10966 v[239]=v[136]*v[5101+i215]+v[5116+i215];
10967 v[240]=(-(v[144]*v[238])+v[146]*v[239])/v[155];
10968 v[241]=v[137]*v[5131+i215]+v[5146+i215];
10969 v[242]=v[136]*v[5161+i215]+v[5176+i215];
10970 v[243]=(v[141]*v[241]-v[143]*v[242])/v[155];
10972 v[256]=v[194]*(v[141]*v[238]-v[143]*v[239]-v[144]*v[241]+v[146]*v[242])*v[519];
10973 v[245]=v[143]*v[246]-v[146]*v[247];
10974 v[248]=-(v[141]*v[246])+v[144]*v[247];
10975 v[249]=-v[240]-v[243];
10976 v[252]=-(v[192]*v[249]);
10977 v[520]=(2e0*v[194]*v[243]+v[252])/v[155];
10978 v[521]=(2e0*v[194]*v[240]+v[252])/v[155];
10979 v[255]=v[146]*v[256]-v[143]*v[520];
10980 v[268]=v[136]*v[255];
10981 v[257]=-(v[144]*v[256])+v[141]*v[520];
10982 v[269]=v[137]*v[257];
10983 v[258]=-(v[143]*v[256])+v[146]*v[521];
10984 v[264]=v[136]*v[258];
10985 v[259]=v[141]*v[256]-v[144]*v[521];
10986 v[265]=v[137]*v[259];
10988 v[5207]=v[132]*(v[258]+v[146]*v[260]);
10989 v[5208]=v[132]*(v[255]-v[143]*v[260]);
10991 v[5209]=v[133]*(v[259]-v[144]*v[260]);
10992 v[5210]=v[133]*(v[257]+v[141]*v[260]);
10993 v[5211]=v[135]*(v[258]+v[259])+v[261]*(v[522]+v[523]);
10994 v[5212]=v[135]*(v[255]+v[257])+v[261]*(v[524]+v[525]);
10995 v[5213]=v[264]+v[265]+(-v[262]+v[263])*v[509];
10996 v[5214]=v[268]+v[269]+(v[266]-v[267])*v[509];
10997 v[5215]=v[138]*v[259]-v[264]+v[509]*(-v[263]+v[526]);
10998 v[5216]=v[138]*v[257]-v[268]+v[509]*(v[267]+v[527]);
10999 v[5217]=v[140]*v[258]-v[265]+v[509]*(v[262]+v[528]);
11000 v[5218]=v[140]*v[255]-v[269]+v[509]*(-v[266]+v[529]);
11001 v[5219]=v[245]+v[108]*v[249];
11002 v[5220]=v[248]+v[110]*v[249];
11003 v[5221]=-v[245]-v[248]-v[119]*v[249];
11004 p[i215-1]+=v[148]*v[5022+i215];
11005 for(i230=1;i230<=15;i230++){
11006 s[i215-1][i230-1]+=v[148]*v[5206+i230];
11013template <
class SC,
class LO,
class GO,
class NO>
11015 ,
NodeData **nd,
double *rdata,
int *idata,
double *p,
double **s)
11017 int i114,i116,i233,i250,b297;
11121 v[19]=nd[0]->at[0];
11122 v[20]=nd[0]->at[1];
11123 v[21]=nd[1]->at[0];
11124 v[22]=nd[1]->at[1];
11125 v[23]=nd[2]->at[0];
11126 v[24]=nd[2]->at[1];
11127 v[25]=nd[3]->at[0];
11128 v[26]=nd[3]->at[1];
11129 v[27]=nd[4]->at[0];
11130 v[28]=nd[4]->at[1];
11131 v[29]=nd[5]->at[0];
11132 v[30]=nd[5]->at[1];
11133 v[31]=nd[6]->at[0];
11134 v[32]=nd[7]->at[0];
11135 v[33]=nd[8]->at[0];
11136 v[179]=v[32]-v[33];
11137 v[178]=v[31]-v[33];
11138 v[34]=nd[0]->ap[0];
11139 v[574]=v[19]-v[34];
11140 v[35]=nd[0]->ap[1];
11141 v[576]=v[20]-v[35];
11142 v[36]=nd[1]->ap[0];
11143 v[578]=v[21]-v[36];
11144 v[37]=nd[1]->ap[1];
11145 v[579]=v[22]-v[37];
11146 v[38]=nd[2]->ap[0];
11147 v[580]=v[23]-v[38];
11148 v[39]=nd[2]->ap[1];
11149 v[581]=v[24]-v[39];
11150 v[40]=nd[3]->ap[0];
11151 v[582]=v[25]-v[40];
11152 v[41]=nd[3]->ap[1];
11153 v[583]=v[26]-v[41];
11154 v[42]=nd[4]->ap[0];
11155 v[584]=v[27]-v[42];
11156 v[43]=nd[4]->ap[1];
11157 v[585]=v[28]-v[43];
11158 v[44]=nd[5]->ap[0];
11159 v[586]=v[29]-v[44];
11160 v[45]=nd[5]->ap[1];
11161 v[587]=v[30]-v[45];
11164 v[571]=v[49]/(1e0+v[50]);
11165 v[51]=(v[50]*v[571])/(1e0-2e0*v[50]);
11169 v[56]=rdata[RD_TimeIncrement];
11195 v[575]=1e0/(Power(v[56],2)*v[82]);
11196 v[577]=-((v[56]*v[56])*(0.5e0-v[82]));
11197 v[86]=es->Data[4]/(v[56]*v[82]);
11198 v[572]=-(v[56]*v[86]);
11199 v[573]=v[56]*(1e0+v[572]/2e0);
11201 v[83]=v[573]*v[69]+v[57]*v[84]+v[574]*v[86];
11202 v[87]=v[573]*v[75]+v[63]*v[84]+v[576]*v[86];
11203 v[88]=v[573]*v[70]+v[58]*v[84]+v[578]*v[86];
11204 v[89]=v[573]*v[76]+v[64]*v[84]+v[579]*v[86];
11205 v[90]=v[573]*v[71]+v[59]*v[84]+v[580]*v[86];
11206 v[91]=v[573]*v[77]+v[65]*v[84]+v[581]*v[86];
11207 v[92]=v[573]*v[72]+v[60]*v[84]+v[582]*v[86];
11208 v[93]=v[573]*v[78]+v[66]*v[84]+v[583]*v[86];
11209 v[94]=v[573]*v[73]+v[61]*v[84]+v[584]*v[86];
11210 v[95]=v[573]*v[79]+v[67]*v[84]+v[585]*v[86];
11211 v[96]=v[573]*v[74]+v[62]*v[84]+v[586]*v[86];
11212 v[97]=v[573]*v[80]+v[68]*v[84]+v[587]*v[86];
11213 v[98]=v[575]*(-(v[56]*v[57])+v[574]+v[577]*v[69]);
11214 v[102]=v[575]*(v[576]-v[56]*v[63]+v[577]*v[75]);
11215 v[103]=v[575]*(v[578]-v[56]*v[58]+v[577]*v[70]);
11216 v[104]=v[575]*(v[579]-v[56]*v[64]+v[577]*v[76]);
11217 v[105]=v[575]*(v[580]-v[56]*v[59]+v[577]*v[71]);
11218 v[106]=v[575]*(v[581]-v[56]*v[65]+v[577]*v[77]);
11219 v[107]=v[575]*(v[582]-v[56]*v[60]+v[577]*v[72]);
11220 v[108]=v[575]*(v[583]-v[56]*v[66]+v[577]*v[78]);
11221 v[109]=v[575]*(v[584]-v[56]*v[61]+v[577]*v[73]);
11222 v[110]=v[575]*(v[585]-v[56]*v[67]+v[577]*v[79]);
11223 v[111]=v[575]*(v[586]-v[56]*v[62]+v[577]*v[74]);
11224 v[112]=v[575]*(v[587]-v[56]*v[68]+v[577]*v[80]);
11249 for(i114=1;i114<=es->id.NoIntPoints;i114++){
11251 v[115]=es->IntPoints[i116];
11253 v[139]=-1e0+v[144];
11254 v[117]=es->IntPoints[1+i116];
11256 v[140]=-1e0+v[143];
11257 v[126]=-1e0+v[115]+v[117];
11273 v[146]=-4e0*v[126];
11274 v[147]=-v[144]+v[146];
11275 v[145]=-v[143]+v[146];
11276 v[142]=-1e0+2e0*v[115]+2e0*v[117]+2e0*v[126];
11337 v[171]=v[142]*v[91];
11338 v[168]=v[142]*v[90];
11339 v[160]=v[142]*v[24];
11340 v[161]=v[160]+v[140]*v[22]+v[145]*v[28]+v[144]*(v[26]-v[30]);
11341 v[159]=v[160]+v[139]*v[20]+v[143]*(v[26]-v[28])+v[147]*v[30];
11342 v[157]=v[142]*v[23];
11343 v[158]=v[157]+v[140]*v[21]+v[145]*v[27]+v[144]*(v[25]-v[29]);
11344 v[156]=v[157]+v[139]*v[19]+v[143]*(v[25]-v[27])+v[147]*v[29];
11345 v[152]=v[142]*v[6];
11346 v[153]=v[10]*v[145]+v[152]+v[140]*v[4]+v[144]*(-v[12]+v[8]);
11347 v[151]=v[12]*v[147]+v[152]+v[139]*v[2]+v[143]*(-v[10]+v[8]);
11348 v[149]=v[142]*v[5];
11349 v[150]=v[149]+v[140]*v[3]+v[144]*(-v[11]+v[7])+v[145]*v[9];
11350 v[148]=v[1]*v[139]+v[11]*v[147]+v[149]+v[143]*(v[7]-v[9]);
11351 v[162]=-(v[150]*v[151])+v[148]*v[153];
11352 v[610]=-(v[150]/v[162]);
11353 v[614]=v[147]*v[610];
11354 v[609]=v[148]/v[162];
11355 v[612]=v[145]*v[609];
11356 v[608]=v[153]/v[162];
11357 v[613]=v[147]*v[608];
11358 v[607]=-(v[151]/v[162]);
11359 v[611]=v[145]*v[607];
11360 v[589]=v[144]/v[162];
11361 v[588]=v[143]/v[162];
11362 v[292]=v[150]*v[588];
11363 v[291]=v[148]*v[589];
11364 v[288]=v[153]*v[588];
11365 v[287]=v[151]*v[589];
11366 v[155]=es->IntPoints[3+i116]*std::fabs(v[162]);
11367 v[163]=(v[153]*v[156]-v[151]*v[158])/v[162];
11368 v[164]=(-(v[150]*v[156])+v[148]*v[158])/v[162];
11369 v[165]=(v[153]*v[159]-v[151]*v[161])/v[162];
11370 v[166]=(-(v[150]*v[159])+v[148]*v[161])/v[162];
11373 v[195]=0.5e0*(-1e0+(v[165]*v[165])+(v[190]*v[190]));
11374 v[200]=0.5e0*(-1e0+(v[164]*v[164])+(v[191]*v[191]));
11375 v[591]=-(v[115]*v[31])-v[117]*v[32]+v[126]*v[33]+(v[195]+v[200])*v[51];
11376 v[206]=1e0-(1e0+v[163]+v[166])*v[54];
11377 v[590]=v[55]/(v[162]*v[206]);
11378 v[604]=v[206]*v[590];
11379 v[222]=2e0*v[195]*v[53]+v[591];
11380 v[223]=2e0*v[200]*v[53]+v[591];
11381 v[226]=(-(v[151]*(v[168]+v[140]*v[88]+v[144]*v[92]+v[145]*v[94]-v[144]*v[96]))+v[153]*(v[168]
11382 +v[139]*v[83]+v[143]*v[92]-v[143]*v[94]+v[147]*v[96])+v[148]*(v[171]+v[140]*v[89]+v[144]*v[93]
11383 +v[145]*v[95]-v[144]*v[97])-v[150]*(v[171]+v[139]*v[87]+v[143]*v[93]-v[143]*v[95]+v[147]*v[97]))
11385 v[228]=(-(v[153]*v[178])+v[151]*v[179])*v[206]*v[590];
11386 v[229]=(v[150]*v[178]-v[148]*v[179])*v[206]*v[590];
11387 v[236]=-1e0*(v[164]*v[190]+v[165]*v[191])*v[53];
11388 v[237]=(v[153]*v[228]-v[150]*v[229])/v[162];
11389 v[238]=(-(v[151]*v[228])+v[148]*v[229])/v[162];
11390 v[239]=(-(v[150]*v[223])+v[153]*v[236])/v[162];
11391 v[245]=v[143]*v[239];
11392 v[240]=(v[148]*v[223]-v[151]*v[236])/v[162];
11393 v[246]=v[144]*v[240];
11394 v[241]=(v[153]*v[222]-v[150]*v[236])/v[162];
11395 v[243]=v[143]*v[241];
11396 v[242]=(-(v[151]*v[222])+v[148]*v[236])/v[162];
11397 v[244]=v[144]*v[242];
11398 v[5023]=v[139]*v[241];
11399 v[5024]=v[139]*v[239];
11400 v[5025]=v[140]*v[242];
11401 v[5026]=v[140]*v[240];
11402 v[5027]=v[142]*(v[241]+v[242]);
11403 v[5028]=v[142]*(v[239]+v[240]);
11404 v[5029]=v[243]+v[244];
11405 v[5030]=v[245]+v[246];
11406 v[5031]=v[145]*v[242]-v[243];
11407 v[5032]=v[145]*v[240]-v[245];
11408 v[5033]=v[147]*v[241]-v[244];
11409 v[5034]=v[147]*v[239]-v[246];
11410 v[5035]=-(v[115]*v[226])+v[237];
11411 v[5036]=-(v[117]*v[226])+v[238];
11412 v[5037]=v[126]*v[226]-v[237]-v[238];
11413 for(i233=1;i233<=15;i233++){
11414 v[253]=v[5161+i233];
11415 v[254]=v[5176+i233];
11416 v[595]=v[5191+i233]*v[86];
11417 v[286]=v[142]*v[595];
11418 v[285]=v[595]/v[162];
11419 v[256]=v[144]*v[5041+i233]+v[5056+i233];
11420 v[257]=v[143]*v[5071+i233]+v[5086+i233];
11421 v[258]=(-(v[151]*v[256])+v[153]*v[257])/v[162];
11422 v[259]=v[144]*v[5101+i233]+v[5116+i233];
11423 v[260]=v[143]*v[5131+i233]+v[5146+i233];
11424 v[261]=(v[148]*v[259]-v[150]*v[260])/v[162];
11425 v[269]=((v[148]*v[253]-v[150]*v[254])*v[604])/v[162];
11426 v[270]=((-(v[151]*v[253])+v[153]*v[254])*v[604])/v[162];
11427 v[264]=(2e0*(v[148]*v[256]-v[150]*v[257]-v[151]*v[259]+v[153]*v[260])*v[53])/v[162];
11428 v[606]=0.5e0*v[264];
11429 v[605]=0.5e0*v[264];
11430 v[268]=v[150]*v[269]-v[153]*v[270];
11431 v[271]=-(v[148]*v[269])+v[151]*v[270];
11432 v[272]=v[258]+v[261];
11433 v[274]=v[272]*v[51];
11434 v[273]=v[274]+2e0*v[261]*v[53];
11435 v[275]=v[274]+2e0*v[258]*v[53];
11436 v[276]=1e0*v[165]*v[275]-v[191]*v[605];
11437 v[277]=1e0*v[164]*v[273]-v[190]*v[606];
11438 v[278]=-1e0*v[191]*v[273]+v[165]*v[605];
11439 v[280]=-1e0*v[190]*v[275]+v[164]*v[606];
11440 v[281]=(v[153]*v[276]-v[150]*v[278])/v[162];
11441 v[293]=v[143]*v[281];
11442 v[282]=(-(v[151]*v[276])+v[148]*v[278])/v[162];
11443 v[294]=v[144]*v[282];
11444 v[283]=(-(v[150]*v[277])+v[153]*v[280])/v[162];
11445 v[289]=v[143]*v[283];
11446 v[284]=(v[148]*v[277]-v[151]*v[280])/v[162];
11447 v[290]=v[144]*v[284];
11448 v[5207]=v[139]*(v[283]+v[153]*v[285]);
11449 v[5208]=v[139]*(v[281]-v[150]*v[285]);
11450 v[5209]=v[140]*(v[284]-v[151]*v[285]);
11451 v[5210]=v[140]*(v[282]+v[148]*v[285]);
11452 v[5211]=v[142]*(v[283]+v[284])+v[286]*(v[607]+v[608]);
11453 v[5212]=v[142]*(v[281]+v[282])+v[286]*(v[609]+v[610]);
11454 v[5213]=v[289]+v[290]+(-v[287]+v[288])*v[595];
11455 v[5214]=v[293]+v[294]+(v[291]-v[292])*v[595];
11456 v[5215]=v[145]*v[284]-v[289]+v[595]*(-v[288]+v[611]);
11457 v[5216]=v[145]*v[282]-v[293]+v[595]*(v[292]+v[612]);
11458 v[5217]=v[147]*v[283]-v[290]+v[595]*(v[287]+v[613]);
11459 v[5218]=v[147]*v[281]-v[294]+v[595]*(-v[291]+v[614]);
11460 v[5219]=v[268]-v[115]*v[272];
11461 v[5220]=v[271]-v[117]*v[272];
11462 v[5221]=-v[268]-v[271]+v[126]*v[272];
11463 p[i233-1]+=v[155]*v[5022+i233];
11464 for(i250=1;i250<=15;i250++){
11465 s[i233-1][i250-1]+=v[155]*v[5206+i250];
11469 if(idata[ID_CurrentElement]==1e0){
11470 ++idata[ID_NoMessages];
11471 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11472 fprintf(SMSFile,
"\n%s %g %s %g %s %g %s %g ",
"ElementNumber: ",(
double)idata[ID_CurrentElement]
11473 ,
" Time: ",(
double)rdata[RD_Time],
" TimeSteps: ",(
double)idata[ID_Step],
" IterationSteps: ",
11474 (
double)idata[ID_Iteration]);
11475 fclose(SMSFile);};};
11476 ++idata[ID_NoMessages];
11477 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11478 fprintf(SMSFile,
"\n%s %g %s %g %s %g ",
"Emodul: ",(
double)v[49],
" Poissonsratio: ",(
double)v[50]
11479 ,
" InitialSolidVolumeFraction: ",(
double)v[54]);
11480 fclose(SMSFile);};};
11481 ++idata[ID_NoMessages];
11482 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11483 fprintf(SMSFile,
"\n%s %g %s %g ",
"TimeIncrement :",(
double)rdata[RD_TimeIncrement]
11484 ,
" LoadIncrement: ",(
double)rdata[RD_MultiplierIncrement]);
11485 fclose(SMSFile);};};
11486 ++idata[ID_NoMessages];
11487 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11488 fprintf(SMSFile,
"\n%s %g %s %g %s %g %s %g ",
"Nodes: ",(
double)ed->Nodes[0],
" CoorX: ",(
double
11489 )nd[0]->X[0],
" CoorY: ",(
double)nd[0]->X[1],
" NumberDOF: ",(
double)nd[0]->id.NoDOF);
11490 fclose(SMSFile);};};
11491 ++idata[ID_NoMessages];
11492 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11493 fprintf(SMSFile,
"\n%s %g ",
"DOFposition: ",(
double)nd[0]->DOF[0]);
11494 fclose(SMSFile);};};
11495 ++idata[ID_NoMessages];
11496 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11497 fprintf(SMSFile,
"\n%s %g ",
"DOFposition: ",(
double)nd[0]->DOF[1]);
11498 fclose(SMSFile);};};
11499 ++idata[ID_NoMessages];
11500 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11501 fprintf(SMSFile,
"\n%s %g %s %g %s %g %s %g ",
"Nodes: ",(
double)ed->Nodes[1],
" CoorX: ",(
double
11502 )nd[1]->X[0],
" CoorY: ",(
double)nd[1]->X[1],
" NumberDOF: ",(
double)nd[1]->id.NoDOF);
11503 fclose(SMSFile);};};
11504 ++idata[ID_NoMessages];
11505 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11506 fprintf(SMSFile,
"\n%s %g ",
"DOFposition: ",(
double)nd[1]->DOF[0]);
11507 fclose(SMSFile);};};
11508 ++idata[ID_NoMessages];
11509 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11510 fprintf(SMSFile,
"\n%s %g ",
"DOFposition: ",(
double)nd[1]->DOF[1]);
11511 fclose(SMSFile);};};
11512 ++idata[ID_NoMessages];
11513 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11514 fprintf(SMSFile,
"\n%s %g %s %g %s %g %s %g ",
"Nodes: ",(
double)ed->Nodes[2],
" CoorX: ",(
double
11515 )nd[2]->X[0],
" CoorY: ",(
double)nd[2]->X[1],
" NumberDOF: ",(
double)nd[2]->id.NoDOF);
11516 fclose(SMSFile);};};
11517 ++idata[ID_NoMessages];
11518 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11519 fprintf(SMSFile,
"\n%s %g ",
"DOFposition: ",(
double)nd[2]->DOF[0]);
11520 fclose(SMSFile);};};
11521 ++idata[ID_NoMessages];
11522 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11523 fprintf(SMSFile,
"\n%s %g ",
"DOFposition: ",(
double)nd[2]->DOF[1]);
11524 fclose(SMSFile);};};
11525 ++idata[ID_NoMessages];
11526 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11527 fprintf(SMSFile,
"\n%s %g %s %g %s %g %s %g ",
"Nodes: ",(
double)ed->Nodes[3],
" CoorX: ",(
double
11528 )nd[3]->X[0],
" CoorY: ",(
double)nd[3]->X[1],
" NumberDOF: ",(
double)nd[3]->id.NoDOF);
11529 fclose(SMSFile);};};
11530 ++idata[ID_NoMessages];
11531 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11532 fprintf(SMSFile,
"\n%s %g ",
"DOFposition: ",(
double)nd[3]->DOF[0]);
11533 fclose(SMSFile);};};
11534 ++idata[ID_NoMessages];
11535 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11536 fprintf(SMSFile,
"\n%s %g ",
"DOFposition: ",(
double)nd[3]->DOF[1]);
11537 fclose(SMSFile);};};
11538 ++idata[ID_NoMessages];
11539 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11540 fprintf(SMSFile,
"\n%s %g %s %g %s %g %s %g ",
"Nodes: ",(
double)ed->Nodes[4],
" CoorX: ",(
double
11541 )nd[4]->X[0],
" CoorY: ",(
double)nd[4]->X[1],
" NumberDOF: ",(
double)nd[4]->id.NoDOF);
11542 fclose(SMSFile);};};
11543 ++idata[ID_NoMessages];
11544 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11545 fprintf(SMSFile,
"\n%s %g ",
"DOFposition: ",(
double)nd[4]->DOF[0]);
11546 fclose(SMSFile);};};
11547 ++idata[ID_NoMessages];
11548 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11549 fprintf(SMSFile,
"\n%s %g ",
"DOFposition: ",(
double)nd[4]->DOF[1]);
11550 fclose(SMSFile);};};
11551 ++idata[ID_NoMessages];
11552 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11553 fprintf(SMSFile,
"\n%s %g %s %g %s %g %s %g ",
"Nodes: ",(
double)ed->Nodes[5],
" CoorX: ",(
double
11554 )nd[5]->X[0],
" CoorY: ",(
double)nd[5]->X[1],
" NumberDOF: ",(
double)nd[5]->id.NoDOF);
11555 fclose(SMSFile);};};
11556 ++idata[ID_NoMessages];
11557 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11558 fprintf(SMSFile,
"\n%s %g ",
"DOFposition: ",(
double)nd[5]->DOF[0]);
11559 fclose(SMSFile);};};
11560 ++idata[ID_NoMessages];
11561 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11562 fprintf(SMSFile,
"\n%s %g ",
"DOFposition: ",(
double)nd[5]->DOF[1]);
11563 fclose(SMSFile);};};
11564 ++idata[ID_NoMessages];
11565 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11566 fprintf(SMSFile,
"\n%s %g %s %g %s %g %s %g ",
"Nodes: ",(
double)ed->Nodes[6],
" CoorX: ",(
double
11567 )nd[6]->X[0],
" CoorY: ",(
double)nd[6]->X[1],
" NumberDOF: ",(
double)nd[6]->id.NoDOF);
11568 fclose(SMSFile);};};
11569 ++idata[ID_NoMessages];
11570 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11571 fprintf(SMSFile,
"\n%s %g ",
"DOFposition: ",(
double)nd[6]->DOF[0]);
11572 fclose(SMSFile);};};
11573 ++idata[ID_NoMessages];
11574 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11575 fprintf(SMSFile,
"\n%s %g %s %g %s %g %s %g ",
"Nodes: ",(
double)ed->Nodes[7],
" CoorX: ",(
double
11576 )nd[7]->X[0],
" CoorY: ",(
double)nd[7]->X[1],
" NumberDOF: ",(
double)nd[7]->id.NoDOF);
11577 fclose(SMSFile);};};
11578 ++idata[ID_NoMessages];
11579 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11580 fprintf(SMSFile,
"\n%s %g ",
"DOFposition: ",(
double)nd[7]->DOF[0]);
11581 fclose(SMSFile);};};
11582 ++idata[ID_NoMessages];
11583 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11584 fprintf(SMSFile,
"\n%s %g %s %g %s %g %s %g ",
"Nodes: ",(
double)ed->Nodes[8],
" CoorX: ",(
double
11585 )nd[8]->X[0],
" CoorY: ",(
double)nd[8]->X[1],
" NumberDOF: ",(
double)nd[8]->id.NoDOF);
11586 fclose(SMSFile);};};
11587 ++idata[ID_NoMessages];
11588 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11589 fprintf(SMSFile,
"\n%s %g ",
"DOFposition: ",(
double)nd[8]->DOF[0]);
11590 fclose(SMSFile);};};
11591 ++idata[ID_NoMessages];
11592 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11593 fprintf(SMSFile,
"\n%s %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g "
11594 ,
"hp or h1 field: ",(
double)v[57],(
double)v[58],(
double)v[59],(
double)v[60],(
double)v[61],(
double
11595 )v[62],(
double)v[63],(
double)v[64],(
double)v[65],(
double)v[66],(
double)v[67],(
double)v[68],(
double
11596 )v[69],(
double)v[70],(
double)v[71],(
double)v[72],(
double)v[73],(
double)v[74],(
double)v[75],(
double
11597 )v[76],(
double)v[77],(
double)v[78],(
double)v[79],(
double)v[80]);
11598 fclose(SMSFile);};};
11599 ++idata[ID_NoMessages];
11600 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11601 fprintf(SMSFile,
"\n%s %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g "
11602 ,
"ht or h2 field: ",(
double)v[83],(
double)v[88],(
double)v[90],(
double)v[92],(
double)v[94],(
double
11603 )v[96],(
double)v[87],(
double)v[89],(
double)v[91],(
double)v[93],(
double)v[95],(
double)v[97],(
double
11604 )v[98],(
double)v[103],(
double)v[105],(
double)v[107],(
double)v[109],(
double)v[111],(
double)v[102],
11605 (
double)v[104],(
double)v[106],(
double)v[108],(
double)v[110],(
double)v[112]);
11606 fclose(SMSFile);};};
11607 ++idata[ID_NoMessages];
11608 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11609 fprintf(SMSFile,
"\n%s %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g ",
"ap or up field: ",(
double
11610 )v[34],(
double)v[35],(
double)v[36],(
double)v[37],(
double)v[38],(
double)v[39],(
double)v[40],(
double
11611 )v[41],(
double)v[42],(
double)v[43],(
double)v[44],(
double)v[45],(
double)nd[6]->ap[0],(
double)nd[7]
11612 ->ap[0],(
double)nd[8]->ap[0]);
11613 fclose(SMSFile);};};
11614 ++idata[ID_NoMessages];
11615 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11616 fprintf(SMSFile,
"\n%s %g %g %g %g %g %g %g %g %g %g %g %g %g %g %g ",
"at or ul field: ",(
double
11617 )v[19],(
double)v[20],(
double)v[21],(
double)v[22],(
double)v[23],(
double)v[24],(
double)v[25],(
double
11618 )v[26],(
double)v[27],(
double)v[28],(
double)v[29],(
double)v[30],(
double)v[31],(
double)v[32],(
double
11620 fclose(SMSFile);};};
11621 ++idata[ID_NoMessages];
11622 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11623 fprintf(SMSFile,
"\n%s %g %s %g %s %g ",
"Nodes: ",(
double)ed->Nodes[0],
" Ux: ",(
double)nd[0]
11624 ->at[0],
" Uy: ",(
double)nd[0]->at[1]);
11625 fclose(SMSFile);};};
11626 ++idata[ID_NoMessages];
11627 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11628 fprintf(SMSFile,
"\n%s %g %s %g %s %g ",
"Nodes: ",(
double)ed->Nodes[1],
" Ux: ",(
double)nd[1]
11629 ->at[0],
" Uy: ",(
double)nd[1]->at[1]);
11630 fclose(SMSFile);};};
11631 ++idata[ID_NoMessages];
11632 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11633 fprintf(SMSFile,
"\n%s %g %s %g %s %g ",
"Nodes: ",(
double)ed->Nodes[2],
" Ux: ",(
double)nd[2]
11634 ->at[0],
" Uy: ",(
double)nd[2]->at[1]);
11635 fclose(SMSFile);};};
11636 ++idata[ID_NoMessages];
11637 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11638 fprintf(SMSFile,
"\n%s %g %s %g %s %g ",
"Nodes: ",(
double)ed->Nodes[3],
" Ux: ",(
double)nd[3]
11639 ->at[0],
" Uy: ",(
double)nd[3]->at[1]);
11640 fclose(SMSFile);};};
11641 ++idata[ID_NoMessages];
11642 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11643 fprintf(SMSFile,
"\n%s %g %s %g %s %g ",
"Nodes: ",(
double)ed->Nodes[4],
" Ux: ",(
double)nd[4]
11644 ->at[0],
" Uy: ",(
double)nd[4]->at[1]);
11645 fclose(SMSFile);};};
11646 ++idata[ID_NoMessages];
11647 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11648 fprintf(SMSFile,
"\n%s %g %s %g %s %g ",
"Nodes: ",(
double)ed->Nodes[5],
" Ux: ",(
double)nd[5]
11649 ->at[0],
" Uy: ",(
double)nd[5]->at[1]);
11650 fclose(SMSFile);};};
11651 ++idata[ID_NoMessages];
11652 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11653 fprintf(SMSFile,
"\n%s %g %s %g ",
"Nodes: ",(
double)ed->Nodes[6],
" p: ",(
double)nd[6]->at[0]);
11654 fclose(SMSFile);};};
11655 ++idata[ID_NoMessages];
11656 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11657 fprintf(SMSFile,
"\n%s %g %s %g ",
"Nodes: ",(
double)ed->Nodes[7],
" p: ",(
double)nd[7]->at[0]);
11658 fclose(SMSFile);};};
11659 ++idata[ID_NoMessages];
11660 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11661 fprintf(SMSFile,
"\n%s %g %s %g ",
"Nodes: ",(
double)ed->Nodes[8],
" p: ",(
double)nd[8]->at[0]);
11662 fclose(SMSFile);};};
11663 ++idata[ID_NoMessages];
11664 if(1){SMSFile=fopen(
"myoutput.dat",
"a");
if(SMSFile!=NULL){
11665 fprintf(SMSFile,
"\n%s ",
"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%");
11666 fclose(SMSFile);};};
11673template <
class SC,
class LO,
class GO,
class NO>
11674void FE<SC,LO,GO,NO>::SKR_Biot3D(
double* v,
ElementSpec *es,
ElementData *ed,
NodeSpec **ns,
NodeData **nd,
double *rdata,
int *idata,
double *p,
double **s)
11676 int i254,i256,i438,i455;
11809 v[43]=nd[0]->at[0];
11810 v[44]=nd[0]->at[1];
11811 v[45]=nd[0]->at[2];
11812 v[46]=nd[1]->at[0];
11813 v[47]=nd[1]->at[1];
11814 v[48]=nd[1]->at[2];
11815 v[49]=nd[2]->at[0];
11816 v[50]=nd[2]->at[1];
11817 v[51]=nd[2]->at[2];
11818 v[52]=nd[3]->at[0];
11819 v[53]=nd[3]->at[1];
11820 v[54]=nd[3]->at[2];
11821 v[55]=nd[4]->at[0];
11822 v[56]=nd[4]->at[1];
11823 v[57]=nd[4]->at[2];
11824 v[58]=nd[5]->at[0];
11825 v[59]=nd[5]->at[1];
11826 v[60]=nd[5]->at[2];
11827 v[61]=nd[6]->at[0];
11828 v[62]=nd[6]->at[1];
11829 v[63]=nd[6]->at[2];
11830 v[64]=nd[7]->at[0];
11831 v[65]=nd[7]->at[1];
11832 v[66]=nd[7]->at[2];
11833 v[67]=nd[8]->at[0];
11834 v[68]=nd[8]->at[1];
11835 v[69]=nd[8]->at[2];
11836 v[70]=nd[9]->at[0];
11837 v[71]=nd[9]->at[1];
11838 v[72]=nd[9]->at[2];
11839 v[73]=nd[10]->at[0];
11840 v[74]=nd[11]->at[0];
11841 v[75]=nd[12]->at[0];
11842 v[76]=nd[13]->at[0];
11843 v[388]=v[75]-v[76];
11844 v[387]=v[74]-v[76];
11845 v[386]=v[73]-v[76];
11846 v[112]=es->Data[1];
11847 v[962]=es->Data[0]/(1e0+v[112]);
11848 v[113]=(v[112]*v[962])/(1e0-2e0*v[112]);
11850 v[116]=es->Data[2];
11851 v[117]=es->Data[3];
11852 v[118]=es->Data[4];
11853 v[119]=es->Data[5];
11854 v[121]=es->Data[7];
11855 v[122]=es->Data[8];
11856 v[1012]=v[121]-v[122];
11857 v[971]=es->Data[6]/(es->Data[9]*v[122]);
11858 v[433]=-(v[122]*v[971]);
11859 v[995]=v[118]*v[433];
11860 v[994]=v[117]*v[433];
11861 v[993]=v[116]*v[433];
11862 v[963]=-(es->Data[10]/es->Data[11]);
11864 v[127]=rdata[RD_TimeIncrement];
11865 v[964]=v[127]*(1e0+v[963]/2e0);
11866 v[189]=-(v[963]/v[127]);
11867 v[188]=ed->hp[0]*v[190]+v[189]*(-nd[0]->ap[0]+v[43])+ed->hp[30]*v[964];
11868 v[192]=ed->hp[10]*v[190]+v[189]*(-nd[0]->ap[1]+v[44])+ed->hp[40]*v[964];
11869 v[193]=ed->hp[20]*v[190]+v[189]*(-nd[0]->ap[2]+v[45])+ed->hp[50]*v[964];
11870 v[194]=ed->hp[1]*v[190]+v[189]*(-nd[1]->ap[0]+v[46])+ed->hp[31]*v[964];
11871 v[195]=ed->hp[11]*v[190]+v[189]*(-nd[1]->ap[1]+v[47])+ed->hp[41]*v[964];
11872 v[196]=ed->hp[21]*v[190]+v[189]*(-nd[1]->ap[2]+v[48])+ed->hp[51]*v[964];
11873 v[197]=ed->hp[2]*v[190]+v[189]*(-nd[2]->ap[0]+v[49])+ed->hp[32]*v[964];
11874 v[198]=ed->hp[12]*v[190]+v[189]*(-nd[2]->ap[1]+v[50])+ed->hp[42]*v[964];
11875 v[199]=ed->hp[22]*v[190]+v[189]*(-nd[2]->ap[2]+v[51])+ed->hp[52]*v[964];
11876 v[200]=ed->hp[3]*v[190]+v[189]*(-nd[3]->ap[0]+v[52])+ed->hp[33]*v[964];
11877 v[201]=ed->hp[13]*v[190]+v[189]*(-nd[3]->ap[1]+v[53])+ed->hp[43]*v[964];
11878 v[202]=ed->hp[23]*v[190]+v[189]*(-nd[3]->ap[2]+v[54])+ed->hp[53]*v[964];
11879 v[203]=ed->hp[4]*v[190]+v[189]*(-nd[4]->ap[0]+v[55])+ed->hp[34]*v[964];
11880 v[204]=ed->hp[14]*v[190]+v[189]*(-nd[4]->ap[1]+v[56])+ed->hp[44]*v[964];
11881 v[205]=ed->hp[24]*v[190]+v[189]*(-nd[4]->ap[2]+v[57])+ed->hp[54]*v[964];
11882 v[206]=ed->hp[5]*v[190]+v[189]*(-nd[5]->ap[0]+v[58])+ed->hp[35]*v[964];
11883 v[207]=ed->hp[15]*v[190]+v[189]*(-nd[5]->ap[1]+v[59])+ed->hp[45]*v[964];
11884 v[208]=ed->hp[25]*v[190]+v[189]*(-nd[5]->ap[2]+v[60])+ed->hp[55]*v[964];
11885 v[209]=ed->hp[6]*v[190]+v[189]*(-nd[6]->ap[0]+v[61])+ed->hp[36]*v[964];
11886 v[210]=ed->hp[16]*v[190]+v[189]*(-nd[6]->ap[1]+v[62])+ed->hp[46]*v[964];
11887 v[211]=ed->hp[26]*v[190]+v[189]*(-nd[6]->ap[2]+v[63])+ed->hp[56]*v[964];
11888 v[212]=ed->hp[7]*v[190]+v[189]*(-nd[7]->ap[0]+v[64])+ed->hp[37]*v[964];
11889 v[213]=ed->hp[17]*v[190]+v[189]*(-nd[7]->ap[1]+v[65])+ed->hp[47]*v[964];
11890 v[214]=ed->hp[27]*v[190]+v[189]*(-nd[7]->ap[2]+v[66])+ed->hp[57]*v[964];
11891 v[215]=ed->hp[8]*v[190]+v[189]*(-nd[8]->ap[0]+v[67])+ed->hp[38]*v[964];
11892 v[216]=ed->hp[18]*v[190]+v[189]*(-nd[8]->ap[1]+v[68])+ed->hp[48]*v[964];
11893 v[217]=ed->hp[28]*v[190]+v[189]*(-nd[8]->ap[2]+v[69])+ed->hp[58]*v[964];
11894 v[218]=ed->hp[9]*v[190]+v[189]*(-nd[9]->ap[0]+v[70])+ed->hp[39]*v[964];
11895 v[219]=ed->hp[19]*v[190]+v[189]*(-nd[9]->ap[1]+v[71])+ed->hp[49]*v[964];
11896 v[220]=ed->hp[29]*v[190]+v[189]*(-nd[9]->ap[2]+v[72])+ed->hp[59]*v[964];
11897 for(i254=1;i254<=es->id.NoIntPoints;i254++){
11899 v[255]=es->IntPoints[i256];
11901 v[374]=-(v[214]*v[286]);
11902 v[367]=-(v[213]*v[286]);
11903 v[360]=-(v[212]*v[286]);
11904 v[281]=-1e0+v[286];
11905 v[257]=es->IntPoints[1+i256];
11907 v[333]=-(v[285]*v[69]);
11908 v[326]=-(v[285]*v[68]);
11909 v[319]=-(v[285]*v[67]);
11910 v[310]=-(v[27]*v[285]);
11911 v[303]=-(v[26]*v[285]);
11912 v[296]=-(v[25]*v[285]);
11913 v[282]=-1e0+v[285];
11914 v[258]=es->IntPoints[2+i256];
11916 v[371]=-(v[220]*v[287]);
11917 v[364]=-(v[219]*v[287]);
11918 v[357]=-(v[218]*v[287]);
11919 v[331]=-(v[287]*v[72]);
11920 v[324]=-(v[287]*v[71]);
11921 v[317]=-(v[287]*v[70]);
11922 v[308]=-(v[287]*v[30]);
11923 v[301]=-(v[287]*v[29]);
11924 v[294]=-(v[28]*v[287]);
11925 v[283]=-1e0+v[287];
11926 v[260]=v[255]*(-1e0+2e0*v[255]);
11927 v[261]=v[257]*(-1e0+2e0*v[257]);
11928 v[262]=v[258]*(-1e0+2e0*v[258]);
11929 v[263]=1e0-v[255]-v[257]-v[258];
11964 v[288]=-4e0*v[263];
11965 v[291]=-v[287]-v[288];
11966 v[290]=-v[285]-v[288];
11967 v[289]=-v[286]-v[288];
12275 v[370]=v[202]*v[284];
12276 v[977]=-(v[217]*v[285])+v[370];
12277 v[363]=v[201]*v[284];
12278 v[976]=-(v[216]*v[285])+v[363];
12279 v[356]=v[200]*v[284];
12280 v[975]=-(v[215]*v[285])+v[356];
12281 v[330]=v[284]*v[54];
12282 v[965]=v[330]-v[286]*v[66];
12283 v[335]=v[333]+v[283]*v[51]+v[285]*v[60]+v[286]*v[63]+v[291]*v[72]+v[965];
12284 v[332]=v[331]+v[282]*v[48]+v[286]*v[57]+v[287]*v[60]+v[290]*v[69]+v[965];
12285 v[329]=v[330]+v[331]+v[333]+v[281]*v[45]+v[285]*v[57]+v[287]*v[63]+v[289]*v[66];
12286 v[323]=v[284]*v[53];
12287 v[966]=v[323]-v[286]*v[65];
12288 v[328]=v[326]+v[283]*v[50]+v[285]*v[59]+v[286]*v[62]+v[291]*v[71]+v[966];
12289 v[325]=v[324]+v[282]*v[47]+v[286]*v[56]+v[287]*v[59]+v[290]*v[68]+v[966];
12290 v[322]=v[323]+v[324]+v[326]+v[281]*v[44]+v[285]*v[56]+v[287]*v[62]+v[289]*v[65];
12291 v[316]=v[284]*v[52];
12292 v[967]=v[316]-v[286]*v[64];
12293 v[321]=v[319]+v[283]*v[49]+v[285]*v[58]+v[286]*v[61]+v[291]*v[70]+v[967];
12294 v[318]=v[317]+v[282]*v[46]+v[286]*v[55]+v[287]*v[58]+v[290]*v[67]+v[967];
12295 v[315]=v[316]+v[317]+v[319]+v[281]*v[43]+v[285]*v[55]+v[287]*v[61]+v[289]*v[64];
12296 v[307]=v[12]*v[284];
12297 v[968]=-(v[24]*v[286])+v[307];
12298 v[312]=v[18]*v[285]+v[21]*v[286]+v[291]*v[30]+v[310]+v[283]*v[9]+v[968];
12299 v[309]=v[15]*v[286]+v[18]*v[287]+v[27]*v[290]+v[308]+v[282]*v[6]+v[968];
12300 v[306]=v[15]*v[285]+v[21]*v[287]+v[24]*v[289]+v[281]*v[3]+v[307]+v[308]+v[310];
12301 v[300]=v[11]*v[284];
12302 v[969]=-(v[23]*v[286])+v[300];
12303 v[305]=v[17]*v[285]+v[20]*v[286]+v[29]*v[291]+v[303]+v[283]*v[8]+v[969];
12304 v[302]=v[14]*v[286]+v[17]*v[287]+v[26]*v[290]+v[301]+v[282]*v[5]+v[969];
12305 v[340]=-(v[305]*v[309])+v[302]*v[312];
12306 v[299]=v[2]*v[281]+v[14]*v[285]+v[20]*v[287]+v[23]*v[289]+v[300]+v[301]+v[303];
12307 v[342]=-(v[302]*v[306])+v[299]*v[309];
12308 v[341]=v[305]*v[306]-v[299]*v[312];
12309 v[293]=v[10]*v[284];
12310 v[970]=-(v[22]*v[286])+v[293];
12311 v[298]=v[16]*v[285]+v[19]*v[286]+v[28]*v[291]+v[296]+v[283]*v[7]+v[970];
12312 v[295]=v[13]*v[286]+v[16]*v[287]+v[25]*v[290]+v[294]+v[282]*v[4]+v[970];
12313 v[348]=-(v[298]*v[302])+v[295]*v[305];
12314 v[344]=v[298]*v[309]-v[295]*v[312];
12315 v[292]=v[1]*v[281]+v[13]*v[285]+v[19]*v[287]+v[22]*v[289]+v[293]+v[294]+v[296];
12316 v[350]=-(v[295]*v[299])+v[292]*v[302];
12317 v[349]=v[298]*v[299]-v[292]*v[305];
12318 v[346]=v[295]*v[306]-v[292]*v[309];
12319 v[345]=-(v[298]*v[306])+v[292]*v[312];
12320 v[336]=v[292]*v[340]+v[295]*v[341]+v[298]*v[342];
12321 v[981]=v[115]/(v[336]*v[336]);
12322 v[972]=v[115]/v[336];
12323 v[480]=v[971]/v[336];
12324 v[521]=v[350]/v[336];
12325 v[520]=v[349]/v[336];
12326 v[1027]=v[520]+v[521];
12327 v[1021]=v[287]*v[520]+v[285]*v[521];
12328 v[519]=v[348]/v[336];
12329 v[1030]=v[519]+v[521];
12330 v[1024]=v[287]*v[519]+v[286]*v[521];
12331 v[1018]=v[285]*v[519]+v[286]*v[520];
12332 v[985]=v[519]+v[520];
12333 v[1015]=v[521]+v[985];
12334 v[518]=v[346]/v[336];
12335 v[517]=v[345]/v[336];
12336 v[1026]=v[517]+v[518];
12337 v[1020]=v[287]*v[517]+v[285]*v[518];
12338 v[516]=v[344]/v[336];
12339 v[1029]=v[516]+v[518];
12340 v[1023]=v[287]*v[516]+v[286]*v[518];
12341 v[1017]=v[285]*v[516]+v[286]*v[517];
12342 v[984]=v[516]+v[517];
12343 v[1014]=v[518]+v[984];
12344 v[515]=v[342]/v[336];
12345 v[514]=v[341]/v[336];
12346 v[1025]=v[514]+v[515];
12347 v[1019]=v[287]*v[514]+v[285]*v[515];
12348 v[513]=v[340]/v[336];
12349 v[1028]=v[513]+v[515];
12350 v[1022]=v[287]*v[513]+v[286]*v[515];
12351 v[1016]=v[285]*v[513]+v[286]*v[514];
12352 v[983]=v[513]+v[514];
12353 v[1013]=v[515]+v[983];
12354 v[264]=v[263]*(-1e0+2e0*v[263]);
12355 v[265]=4e0*v[255]*v[257];
12356 v[266]=4e0*v[257]*v[258];
12357 v[267]=4e0*v[255]*v[258];
12358 v[268]=4e0*v[255]*v[263];
12359 v[269]=4e0*v[257]*v[263];
12360 v[270]=4e0*v[258]*v[263];
12463 v[314]=es->IntPoints[3+i256]*std::fabs(v[336]);
12464 v[393]=(v[315]*v[340]+v[318]*v[341]+v[321]*v[342])/v[336];
12465 v[396]=(v[322]*v[344]+v[325]*v[345]+v[328]*v[346])/v[336];
12466 v[398]=(v[329]*v[348]+v[332]*v[349]+v[335]*v[350])/v[336];
12467 v[974]=v[393]+v[396]+v[398];
12468 v[973]=-(v[255]*v[73])-v[257]*v[74]-v[258]*v[75]-v[263]*v[76]+v[113]*v[974];
12469 v[402]=(v[322]*v[340]+v[325]*v[341]+v[328]*v[342]+v[315]*v[344]+v[318]*v[345]+v[321]*v[346]
12471 v[403]=(v[329]*v[340]+v[332]*v[341]+v[335]*v[342]+v[315]*v[348]+v[318]*v[349]+v[321]*v[350]
12473 v[406]=(v[329]*v[344]+v[332]*v[345]+v[335]*v[346]+v[322]*v[348]+v[325]*v[349]+v[328]*v[350]
12475 v[408]=2e0*v[115]*v[393]+v[973];
12476 v[409]=2e0*v[115]*v[396]+v[973];
12477 v[410]=2e0*v[115]*v[398]+v[973];
12478 v[417]=-(v[119]*(-1e0+v[974]));
12479 v[426]=v[122]*(-1e0+v[417])-v[121]*v[417];
12480 v[425]=v[116]*v[426];
12481 v[427]=v[117]*v[426];
12482 v[428]=v[118]*v[426];
12483 v[430]=(v[341]*(v[194]*v[282]+v[203]*v[286]+v[206]*v[287]+v[215]*v[290]+v[356]+v[357]+v[360])
12484 +v[345]*(v[195]*v[282]+v[204]*v[286]+v[207]*v[287]+v[216]*v[290]+v[363]+v[364]+v[367])+v[349]*
12485 (v[196]*v[282]+v[205]*v[286]+v[208]*v[287]+v[217]*v[290]+v[370]+v[371]+v[374])+v[340]*
12486 (v[188]*v[281]+v[203]*v[285]+v[209]*v[287]+v[212]*v[289]+v[357]+v[975])+v[342]*(v[197]*v[283]
12487 +v[206]*v[285]+v[209]*v[286]+v[218]*v[291]+v[360]+v[975])+v[344]*(v[192]*v[281]+v[204]*v[285]
12488 +v[210]*v[287]+v[213]*v[289]+v[364]+v[976])+v[346]*(v[198]*v[283]+v[207]*v[285]+v[210]*v[286]
12489 +v[219]*v[291]+v[367]+v[976])+v[348]*(v[193]*v[281]+v[205]*v[285]+v[211]*v[287]+v[214]*v[289]
12490 +v[371]+v[977])+v[350]*(v[199]*v[283]+v[208]*v[285]+v[211]*v[286]+v[220]*v[291]+v[374]+v[977]))
12492 v[432]=(v[340]*v[386]+v[341]*v[387]+v[342]*v[388])*v[480]+v[993];
12493 v[434]=(v[344]*v[386]+v[345]*v[387]+v[346]*v[388])*v[480]+v[994];
12494 v[435]=(v[348]*v[386]+v[349]*v[387]+v[350]*v[388])*v[480]+v[995];
12495 v[440]=(v[340]*v[432]+v[344]*v[434]+v[348]*v[435])/v[336];
12496 v[441]=(v[341]*v[432]+v[345]*v[434]+v[349]*v[435])/v[336];
12497 v[442]=(v[342]*v[432]+v[346]*v[434]+v[350]*v[435])/v[336];
12498 v[443]=(v[340]*v[403]+v[344]*v[406]+v[348]*v[410])/v[336];
12499 v[444]=(v[341]*v[403]+v[345]*v[406]+v[349]*v[410])/v[336];
12500 v[445]=(v[342]*v[403]+v[346]*v[406]+v[350]*v[410])/v[336];
12501 v[980]=v[444]+v[445];
12502 v[446]=(v[340]*v[402]+v[348]*v[406]+v[344]*v[409])/v[336];
12503 v[447]=(v[341]*v[402]+v[349]*v[406]+v[345]*v[409])/v[336];
12504 v[448]=(v[342]*v[402]+v[350]*v[406]+v[346]*v[409])/v[336];
12505 v[979]=v[447]+v[448];
12506 v[449]=(v[344]*v[402]+v[348]*v[403]+v[340]*v[408])/v[336];
12507 v[450]=(v[345]*v[402]+v[349]*v[403]+v[341]*v[408])/v[336];
12508 v[451]=(v[346]*v[402]+v[350]*v[403]+v[342]*v[408])/v[336];
12509 v[978]=v[450]+v[451];
12510 v[1102]=v[260]*v[425]+v[281]*v[449];
12511 v[1103]=v[260]*v[427]+v[281]*v[446];
12512 v[1104]=v[260]*v[428]+v[281]*v[443];
12513 v[1105]=v[261]*v[425]+v[282]*v[450];
12514 v[1106]=v[261]*v[427]+v[282]*v[447];
12515 v[1107]=v[261]*v[428]+v[282]*v[444];
12516 v[1108]=v[262]*v[425]+v[283]*v[451];
12517 v[1109]=v[262]*v[427]+v[283]*v[448];
12518 v[1110]=v[262]*v[428]+v[283]*v[445];
12519 v[1111]=v[264]*v[425]+v[284]*(v[449]+v[978]);
12520 v[1112]=v[264]*v[427]+v[284]*(v[446]+v[979]);
12521 v[1113]=v[264]*v[428]+v[284]*(v[443]+v[980]);
12522 v[1114]=v[265]*v[425]+v[285]*v[449]+v[286]*v[450];
12523 v[1115]=v[265]*v[427]+v[285]*v[446]+v[286]*v[447];
12524 v[1116]=v[265]*v[428]+v[285]*v[443]+v[286]*v[444];
12525 v[1117]=v[266]*v[425]+v[287]*v[450]+v[285]*v[451];
12526 v[1118]=v[266]*v[427]+v[287]*v[447]+v[285]*v[448];
12527 v[1119]=v[266]*v[428]+v[287]*v[444]+v[285]*v[445];
12528 v[1120]=v[267]*v[425]+v[287]*v[449]+v[286]*v[451];
12529 v[1121]=v[267]*v[427]+v[287]*v[446]+v[286]*v[448];
12530 v[1122]=v[267]*v[428]+v[287]*v[443]+v[286]*v[445];
12531 v[1123]=v[268]*v[425]+v[289]*v[449]-v[286]*v[978];
12532 v[1124]=v[268]*v[427]+v[289]*v[446]-v[286]*v[979];
12533 v[1125]=v[268]*v[428]+v[289]*v[443]-v[286]*v[980];
12534 v[1126]=v[269]*v[425]+v[290]*v[450]-v[285]*(v[449]+v[451]);
12535 v[1127]=v[269]*v[427]+v[290]*v[447]-v[285]*(v[446]+v[448]);
12536 v[1128]=v[269]*v[428]+v[290]*v[444]-v[285]*(v[443]+v[445]);
12537 v[1129]=v[270]*v[425]-v[287]*(v[449]+v[450])+v[291]*v[451];
12538 v[1130]=v[270]*v[427]-v[287]*(v[446]+v[447])+v[291]*v[448];
12539 v[1131]=v[270]*v[428]-v[287]*(v[443]+v[444])+v[291]*v[445];
12540 v[1132]=v[255]*v[430]+v[440];
12541 v[1133]=v[257]*v[430]+v[441];
12542 v[1134]=v[258]*v[430]+v[442];
12543 v[1135]=v[263]*v[430]-v[440]-v[441]-v[442];
12544 for(i438=1;i438<=34;i438++){
12545 v[458]=v[1139+i438];
12546 v[459]=v[1173+i438];
12547 v[460]=v[1207+i438];
12548 v[461]=v[1241+i438];
12549 v[462]=v[1275+i438];
12550 v[463]=v[1309+i438];
12551 v[464]=v[1343+i438];
12552 v[465]=v[1377+i438];
12553 v[466]=v[1411+i438];
12554 v[467]=v[1445+i438];
12555 v[468]=v[1479+i438];
12556 v[469]=v[1513+i438];
12557 v[470]=v[1547+i438];
12558 v[992]=-(v[287]*v[470]);
12559 v[991]=-(v[285]*v[470]);
12560 v[988]=-(v[286]*v[470]);
12561 v[986]=v[189]*v[470];
12562 v[512]=v[284]*v[986];
12563 v[511]=v[470]*v[521];
12564 v[510]=v[470]*v[518];
12565 v[509]=v[470]*v[515];
12566 v[508]=v[470]*v[520];
12567 v[507]=v[470]*v[517];
12568 v[506]=v[470]*v[514];
12569 v[505]=v[470]*v[519];
12570 v[504]=v[470]*v[516];
12571 v[503]=v[470]*v[513];
12572 v[471]=(v[342]*v[458]+v[341]*v[459]+v[340]*v[460])/v[336];
12573 v[472]=(v[346]*v[461]+v[345]*v[462]+v[344]*v[463])/v[336];
12574 v[497]=(v[346]*v[458]+v[345]*v[459]+v[344]*v[460]+v[342]*v[461]+v[341]*v[462]+v[340]*v[463]
12576 v[474]=(v[350]*v[464]+v[349]*v[465]+v[348]*v[466])/v[336];
12577 v[492]=(v[350]*v[461]+v[349]*v[462]+v[348]*v[463]+v[346]*v[464]+v[345]*v[465]+v[344]*v[466]
12579 v[493]=(v[350]*v[458]+v[349]*v[459]+v[348]*v[460]+v[342]*v[464]+v[341]*v[465]+v[340]*v[466]
12581 v[477]=(v[350]*v[467]+v[349]*v[468]+v[348]*v[469])/v[336];
12582 v[478]=(v[346]*v[467]+v[345]*v[468]+v[344]*v[469])/v[336];
12583 v[479]=(v[342]*v[467]+v[341]*v[468]+v[340]*v[469])/v[336];
12584 v[481]=(v[348]*v[477]+v[344]*v[478]+v[340]*v[479])*v[480];
12585 v[482]=(v[349]*v[477]+v[345]*v[478]+v[341]*v[479])*v[480];
12586 v[483]=(v[350]*v[477]+v[346]*v[478]+v[342]*v[479])*v[480];
12587 v[485]=v[471]+v[472]+v[474];
12588 v[982]=v[1012]*v[119]*(v[118]*v[1581+i438]+v[117]*v[1615+i438]+v[116]*v[1649+i438])
12590 v[486]=2e0*v[115]*v[474]+v[982];
12591 v[489]=2e0*v[115]*v[472]+v[982];
12592 v[490]=2e0*v[115]*v[471]+v[982];
12593 v[491]=v[344]*v[492]+v[340]*v[493]+v[486]*v[519];
12594 v[494]=v[345]*v[492]+v[341]*v[493]+v[486]*v[520];
12595 v[495]=v[346]*v[492]+v[342]*v[493]+v[486]*v[521];
12596 v[990]=v[494]+v[495];
12597 v[496]=v[348]*v[492]+v[340]*v[497]+v[489]*v[516];
12598 v[498]=v[349]*v[492]+v[341]*v[497]+v[489]*v[517];
12599 v[499]=v[350]*v[492]+v[342]*v[497]+v[489]*v[518];
12600 v[989]=v[498]+v[499];
12601 v[500]=v[348]*v[493]+v[344]*v[497]+v[490]*v[513];
12602 v[501]=v[349]*v[493]+v[345]*v[497]+v[490]*v[514];
12603 v[502]=v[350]*v[493]+v[346]*v[497]+v[490]*v[515];
12604 v[987]=v[501]+v[502];
12605 v[1684]=v[281]*(v[500]+v[189]*v[503]);
12606 v[1685]=v[281]*(v[496]+v[189]*v[504]);
12607 v[1686]=v[281]*(v[491]+v[189]*v[505]);
12608 v[1687]=v[282]*(v[501]+v[189]*v[506]);
12609 v[1688]=v[282]*(v[498]+v[189]*v[507]);
12610 v[1689]=v[282]*(v[494]+v[189]*v[508]);
12611 v[1690]=v[283]*(v[502]+v[189]*v[509]);
12612 v[1691]=v[283]*(v[499]+v[189]*v[510]);
12613 v[1692]=v[283]*(v[495]+v[189]*v[511]);
12614 v[1693]=v[1013]*v[512]+v[284]*(v[500]+v[987]);
12615 v[1694]=v[1014]*v[512]+v[284]*(v[496]+v[989]);
12616 v[1695]=v[1015]*v[512]+v[284]*(v[491]+v[990]);
12617 v[1696]=v[285]*v[500]+v[286]*v[501]+v[1016]*v[986];
12618 v[1697]=v[285]*v[496]+v[286]*v[498]+v[1017]*v[986];
12619 v[1698]=v[285]*v[491]+v[286]*v[494]+v[1018]*v[986];
12620 v[1699]=v[287]*v[501]+v[285]*v[502]+v[1019]*v[986];
12621 v[1700]=v[287]*v[498]+v[285]*v[499]+v[1020]*v[986];
12622 v[1701]=v[287]*v[494]+v[285]*v[495]+v[1021]*v[986];
12623 v[1702]=v[287]*v[500]+v[286]*v[502]+v[1022]*v[986];
12624 v[1703]=v[287]*v[496]+v[286]*v[499]+v[1023]*v[986];
12625 v[1704]=v[287]*v[491]+v[286]*v[495]+v[1024]*v[986];
12626 v[1705]=v[289]*v[500]-v[286]*v[987]+v[189]*(v[289]*v[503]+v[1025]*v[988]);
12627 v[1706]=v[289]*v[496]+v[189]*(v[289]*v[504]+v[1026]*v[988])-v[286]*v[989];
12628 v[1707]=v[289]*v[491]+v[189]*(v[289]*v[505]+v[1027]*v[988])-v[286]*v[990];
12629 v[1708]=v[290]*v[501]-v[285]*(v[500]+v[502])+v[189]*(v[290]*v[506]+v[1028]*v[991]);
12630 v[1709]=v[290]*v[498]-v[285]*(v[496]+v[499])+v[189]*(v[290]*v[507]+v[1029]*v[991]);
12631 v[1710]=v[290]*v[494]-v[285]*(v[491]+v[495])+v[189]*(v[290]*v[508]+v[1030]*v[991]);
12632 v[1711]=-(v[287]*(v[500]+v[501]))+v[291]*v[502]+v[189]*(v[291]*v[509]+v[983]*v[992]);
12633 v[1712]=-(v[287]*(v[496]+v[498]))+v[291]*v[499]+v[189]*(v[291]*v[510]+v[984]*v[992]);
12634 v[1713]=-(v[287]*(v[491]+v[494]))+v[291]*v[495]+v[189]*(v[291]*v[511]+v[985]*v[992]);
12635 v[1714]=v[481]-v[255]*v[485];
12636 v[1715]=v[482]-v[257]*v[485];
12637 v[1716]=v[483]-v[258]*v[485];
12638 v[1717]=-v[481]-v[482]-v[483]-v[263]*v[485];
12639 p[i438-1]+=v[1101+i438]*v[314];
12640 for(i455=1;i455<=34;i455++){
12641 s[i438-1][i455-1]+=v[1683+i455]*v[314];
12649 ,
NodeData **nd,
double *rdata,
int *idata,
double **gpost,
double **npost)
12652 v[524]=nd[0]->X[0];
12653 v[525]=nd[0]->X[1];
12654 v[526]=nd[0]->X[2];
12655 v[527]=nd[1]->X[0];
12656 v[528]=nd[1]->X[1];
12657 v[529]=nd[1]->X[2];
12658 v[530]=nd[2]->X[0];
12659 v[531]=nd[2]->X[1];
12660 v[532]=nd[2]->X[2];
12661 v[533]=nd[3]->X[0];
12662 v[534]=nd[3]->X[1];
12663 v[535]=nd[3]->X[2];
12664 v[536]=nd[4]->X[0];
12665 v[537]=nd[4]->X[1];
12666 v[538]=nd[4]->X[2];
12667 v[539]=nd[5]->X[0];
12668 v[540]=nd[5]->X[1];
12669 v[541]=nd[5]->X[2];
12670 v[542]=nd[6]->X[0];
12671 v[543]=nd[6]->X[1];
12672 v[544]=nd[6]->X[2];
12673 v[545]=nd[7]->X[0];
12674 v[546]=nd[7]->X[1];
12675 v[547]=nd[7]->X[2];
12676 v[548]=nd[8]->X[0];
12677 v[549]=nd[8]->X[1];
12678 v[550]=nd[8]->X[2];
12679 v[551]=nd[9]->X[0];
12680 v[552]=nd[9]->X[1];
12681 v[553]=nd[9]->X[2];
12682 v[566]=nd[0]->at[0];
12683 v[567]=nd[0]->at[1];
12684 v[568]=nd[0]->at[2];
12685 v[569]=nd[1]->at[0];
12686 v[570]=nd[1]->at[1];
12687 v[571]=nd[1]->at[2];
12688 v[572]=nd[2]->at[0];
12689 v[573]=nd[2]->at[1];
12690 v[574]=nd[2]->at[2];
12691 v[575]=nd[3]->at[0];
12692 v[576]=nd[3]->at[1];
12693 v[577]=nd[3]->at[2];
12694 v[578]=nd[4]->at[0];
12695 v[579]=nd[4]->at[1];
12696 v[580]=nd[4]->at[2];
12697 v[581]=nd[5]->at[0];
12698 v[582]=nd[5]->at[1];
12699 v[583]=nd[5]->at[2];
12700 v[584]=nd[6]->at[0];
12701 v[585]=nd[6]->at[1];
12702 v[586]=nd[6]->at[2];
12703 v[587]=nd[7]->at[0];
12704 v[588]=nd[7]->at[1];
12705 v[589]=nd[7]->at[2];
12706 v[590]=nd[8]->at[0];
12707 v[591]=nd[8]->at[1];
12708 v[592]=nd[8]->at[2];
12709 v[593]=nd[9]->at[0];
12710 v[594]=nd[9]->at[1];
12711 v[595]=nd[9]->at[2];
12712 v[596]=nd[10]->at[0];
12713 v[597]=nd[11]->at[0];
12714 v[598]=nd[12]->at[0];
12715 v[599]=nd[13]->at[0];
12716 v[911]=v[598]-v[599];
12717 v[910]=v[597]-v[599];
12718 v[909]=v[596]-v[599];
12719 v[635]=es->Data[1];
12720 v[1031]=es->Data[0]/(1e0+v[635]);
12721 v[636]=(v[1031]*v[635])/(1e0-2e0*v[635]);
12722 v[638]=v[1031]/2e0;
12723 v[642]=es->Data[5];
12724 v[643]=es->Data[6];
12725 for(i777=1;i777<=es->id.NoIntPoints;i777++){
12727 v[778]=es->IntPoints[i779];
12729 v[804]=-1e0+v[809];
12730 v[780]=es->IntPoints[1+i779];
12732 v[856]=-(v[592]*v[808]);
12733 v[849]=-(v[591]*v[808]);
12734 v[842]=-(v[590]*v[808]);
12735 v[833]=-(v[550]*v[808]);
12736 v[826]=-(v[549]*v[808]);
12737 v[819]=-(v[548]*v[808]);
12738 v[805]=-1e0+v[808];
12739 v[781]=es->IntPoints[2+i779];
12741 v[854]=-(v[595]*v[810]);
12742 v[847]=-(v[594]*v[810]);
12743 v[840]=-(v[593]*v[810]);
12744 v[831]=-(v[553]*v[810]);
12745 v[824]=-(v[552]*v[810]);
12746 v[817]=-(v[551]*v[810]);
12747 v[806]=-1e0+v[810];
12748 v[783]=v[778]*(-1e0+2e0*v[778]);
12749 v[784]=v[780]*(-1e0+2e0*v[780]);
12750 v[785]=v[781]*(-1e0+2e0*v[781]);
12751 v[786]=1e0-v[778]-v[780]-v[781];
12752 v[811]=-4e0*v[786];
12753 v[814]=-v[810]-v[811];
12754 v[813]=-v[808]-v[811];
12755 v[812]=-v[809]-v[811];
12757 v[853]=v[577]*v[807];
12758 v[1032]=-(v[589]*v[809])+v[853];
12759 v[858]=v[1032]+v[574]*v[806]+v[583]*v[808]+v[586]*v[809]+v[595]*v[814]+v[856];
12760 v[855]=v[1032]+v[571]*v[805]+v[580]*v[809]+v[583]*v[810]+v[592]*v[813]+v[854];
12761 v[852]=v[568]*v[804]+v[580]*v[808]+v[586]*v[810]+v[589]*v[812]+v[853]+v[854]+v[856];
12762 v[846]=v[576]*v[807];
12763 v[1033]=-(v[588]*v[809])+v[846];
12764 v[851]=v[1033]+v[573]*v[806]+v[582]*v[808]+v[585]*v[809]+v[594]*v[814]+v[849];
12765 v[848]=v[1033]+v[570]*v[805]+v[579]*v[809]+v[582]*v[810]+v[591]*v[813]+v[847];
12766 v[845]=v[567]*v[804]+v[579]*v[808]+v[585]*v[810]+v[588]*v[812]+v[846]+v[847]+v[849];
12767 v[839]=v[575]*v[807];
12768 v[1034]=-(v[587]*v[809])+v[839];
12769 v[844]=v[1034]+v[572]*v[806]+v[581]*v[808]+v[584]*v[809]+v[593]*v[814]+v[842];
12770 v[841]=v[1034]+v[569]*v[805]+v[578]*v[809]+v[581]*v[810]+v[590]*v[813]+v[840];
12771 v[838]=v[566]*v[804]+v[578]*v[808]+v[584]*v[810]+v[587]*v[812]+v[839]+v[840]+v[842];
12772 v[830]=v[535]*v[807];
12773 v[1035]=-(v[547]*v[809])+v[830];
12774 v[835]=v[1035]+v[532]*v[806]+v[541]*v[808]+v[544]*v[809]+v[553]*v[814]+v[833];
12775 v[832]=v[1035]+v[529]*v[805]+v[538]*v[809]+v[541]*v[810]+v[550]*v[813]+v[831];
12776 v[829]=v[526]*v[804]+v[538]*v[808]+v[544]*v[810]+v[547]*v[812]+v[830]+v[831]+v[833];
12777 v[823]=v[534]*v[807];
12778 v[1036]=-(v[546]*v[809])+v[823];
12779 v[828]=v[1036]+v[531]*v[806]+v[540]*v[808]+v[543]*v[809]+v[552]*v[814]+v[826];
12780 v[825]=v[1036]+v[528]*v[805]+v[537]*v[809]+v[540]*v[810]+v[549]*v[813]+v[824];
12781 v[863]=-(v[828]*v[832])+v[825]*v[835];
12782 v[822]=v[525]*v[804]+v[537]*v[808]+v[543]*v[810]+v[546]*v[812]+v[823]+v[824]+v[826];
12783 v[865]=-(v[825]*v[829])+v[822]*v[832];
12784 v[864]=v[828]*v[829]-v[822]*v[835];
12785 v[816]=v[533]*v[807];
12786 v[1037]=-(v[545]*v[809])+v[816];
12787 v[821]=v[1037]+v[530]*v[806]+v[539]*v[808]+v[542]*v[809]+v[551]*v[814]+v[819];
12788 v[818]=v[1037]+v[527]*v[805]+v[536]*v[809]+v[539]*v[810]+v[548]*v[813]+v[817];
12789 v[871]=-(v[821]*v[825])+v[818]*v[828];
12790 v[867]=v[821]*v[832]-v[818]*v[835];
12791 v[815]=v[524]*v[804]+v[536]*v[808]+v[542]*v[810]+v[545]*v[812]+v[816]+v[817]+v[819];
12792 v[873]=-(v[818]*v[822])+v[815]*v[825];
12793 v[872]=v[821]*v[822]-v[815]*v[828];
12794 v[869]=v[818]*v[829]-v[815]*v[832];
12795 v[868]=-(v[821]*v[829])+v[815]*v[835];
12796 v[859]=v[815]*v[863]+v[818]*v[864]+v[821]*v[865];
12797 v[1048]=v[873]/v[859];
12798 v[1047]=v[872]/v[859];
12799 v[1046]=v[871]/v[859];
12800 v[1045]=v[869]/v[859];
12801 v[1044]=v[868]/v[859];
12802 v[1043]=v[867]/v[859];
12803 v[1042]=v[865]/v[859];
12804 v[1041]=v[864]/v[859];
12805 v[1040]=v[863]/v[859];
12806 v[787]=v[786]*(-1e0+2e0*v[786]);
12807 v[788]=4e0*v[778]*v[780];
12808 v[789]=4e0*v[780]*v[781];
12809 v[790]=4e0*v[778]*v[781];
12810 v[791]=4e0*v[778]*v[786];
12811 v[792]=4e0*v[780]*v[786];
12812 v[793]=4e0*v[781]*v[786];
12813 v[803]=v[596]*v[778]+v[597]*v[780]+v[598]*v[781]+v[599]*v[786];
12814 v[916]=(v[838]*v[863]+v[841]*v[864]+v[844]*v[865])/v[859];
12815 v[919]=(v[845]*v[867]+v[848]*v[868]+v[851]*v[869])/v[859];
12816 v[921]=(v[852]*v[871]+v[855]*v[872]+v[858]*v[873])/v[859];
12817 v[1038]=v[916]+v[919]+v[921];
12818 v[1039]=v[1038]*v[636]-v[803];
12819 v[1049]=-(v[643]/(1e0+(-1e0+v[1038])*v[642]));
12820 gpost[i777-1][0]=v[803];
12821 gpost[i777-1][1]=v[566]*v[783]+v[569]*v[784]+v[572]*v[785]+v[575]*v[787]+v[578]*v[788]
12822 +v[581]*v[789]+v[584]*v[790]+v[587]*v[791]+v[590]*v[792]+v[593]*v[793];
12823 gpost[i777-1][2]=v[567]*v[783]+v[570]*v[784]+v[573]*v[785]+v[576]*v[787]+v[579]*v[788]
12824 +v[582]*v[789]+v[585]*v[790]+v[588]*v[791]+v[591]*v[792]+v[594]*v[793];
12825 gpost[i777-1][3]=v[568]*v[783]+v[571]*v[784]+v[574]*v[785]+v[577]*v[787]+v[580]*v[788]
12826 +v[583]*v[789]+v[586]*v[790]+v[589]*v[791]+v[592]*v[792]+v[595]*v[793];
12827 gpost[i777-1][4]=v[1039]+v[1031]*v[916];
12828 gpost[i777-1][5]=v[1039]+2e0*v[638]*v[919];
12829 gpost[i777-1][6]=v[1039]+v[1031]*v[921];
12830 gpost[i777-1][7]=v[638]*(v[1043]*v[838]+v[1044]*v[841]+v[1045]*v[844]+v[1040]*v[845]
12831 +v[1041]*v[848]+v[1042]*v[851]);
12832 gpost[i777-1][8]=v[638]*(v[1046]*v[845]+v[1047]*v[848]+v[1048]*v[851]+v[1043]*v[852]
12833 +v[1044]*v[855]+v[1045]*v[858]);
12834 gpost[i777-1][9]=v[638]*(v[1046]*v[838]+v[1047]*v[841]+v[1048]*v[844]+v[1040]*v[852]
12835 +v[1041]*v[855]+v[1042]*v[858]);
12836 gpost[i777-1][10]=v[1049]*(v[1040]*v[909]+v[1041]*v[910]+v[1042]*v[911]);
12837 gpost[i777-1][11]=v[1049]*(v[1043]*v[909]+v[1044]*v[910]+v[1045]*v[911]);
12838 gpost[i777-1][12]=v[1049]*(v[1046]*v[909]+v[1047]*v[910]+v[1048]*v[911]);