597 solution.insert( solution.end(), solution_d.begin(), solution_d.end() );
599 assemblyFEElements_[T]->updateSolution(solution);
600 assemblyFEElements_[T]->updateParameter(
"E",eModVecA[T]);
601 assemblyFEElements_[T]->assembleJacobian();
602 elementMatrix = assemblyFEElements_[T]->getJacobian();
603 addFeBlock(A, elementMatrix, elements->getElement(T), map, 0, 0, problemDisk);
605 assemblyFEElements_[T]->assembleRHS();
606 rhsVec = assemblyFEElements_[T]->getRHS();
607 addFeBlockMv(resVec, rhsVec, elements->getElement(T), dofs);
609 assemblyFEElements_[T]->advanceNewtonStep();
613 if (callFillComplete)
614 A->getBlock(0,0)->fillComplete( domainVec_.at(0)->getMapVecFieldUnique(),domainVec_.at(0)->getMapVecFieldUnique());
631template <
class SC,
class LO,
class GO,
class NO>
632void FE<SC,LO,GO,NO>::addFeBlockMv(BlockMultiVectorPtr_Type &res, vec_dbl_ptr_Type rhsVec,
FiniteElement elementBlock,
int dofs){
634 Teuchos::ArrayRCP<SC> resArray_block = res->getBlockNonConst(0)->getDataNonConst(0);
636 vec_LO_Type nodeList_block = elementBlock.getVectorNodeList();
638 for(
int i=0; i< nodeList_block.size() ; i++){
639 for(
int d=0; d<dofs; d++)
640 resArray_block[nodeList_block[i]*dofs+d] += (*rhsVec)[i*dofs+d];
645template <
class SC,
class LO,
class GO,
class NO>
647 std::string FETypeChem,
648 std::string FETypeSolid,
652 MultiVectorPtr_Type c_rep,
653 MultiVectorPtr_Type d_rep,
654 BlockMatrixPtr_Type &A,
655 BlockMultiVectorPtr_Type &resVec,
656 ParameterListPtr_Type params,
657 std::string assembleMode,
658 bool callFillComplete,
661 if((FETypeChem !=
"P2") || (FETypeSolid !=
"P2") || dim != 3)
662 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"No AceGen Implementation available for Discretization and Dimension." );
668 ElementsPtr_Type elementsChem= domainVec_.at(FElocChem)->getElementsC();
670 ElementsPtr_Type elementsSolid = domainVec_.at(FElocSolid)->getElementsC();
676 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FElocSolid)->getPointsRepeated();
678 MapConstPtr_Type mapChem = domainVec_.at(FElocChem)->getMapRepeated();
680 MapConstPtr_Type mapSolid = domainVec_.at(FElocSolid)->getMapRepeated();
682 vec_dbl_Type solution_c;
683 vec_dbl_Type solution_d;
685 vec_dbl_ptr_Type rhsVec;
690 if(FETypeChem ==
"P2"){
695 if(FETypeChem ==
"P2")
699 if(FETypeSolid ==
"P2")
704 if(FETypeSolid ==
"P2")
707 tuple_disk_vec_ptr_Type problemDisk = Teuchos::rcp(
new tuple_disk_vec_Type(0));
708 tuple_ssii_Type chem (
"Chemistry",FETypeChem,dofsChem,numChem);
709 tuple_ssii_Type solid (
"Solid",FETypeSolid,dofsSolid,numSolid);
710 problemDisk->push_back(solid);
711 problemDisk->push_back(chem);
713 tuple_disk_vec_ptr_Type problemDiskChem = Teuchos::rcp(
new tuple_disk_vec_Type(0));
714 problemDiskChem->push_back(chem);
716 std::string SCIModel = params->sublist(
"Parameter").get(
"Structure Model",
"SCI_simple");
718 if(assemblyFEElements_.size()== 0){
719 initAssembleFEElements(SCIModel,problemDisk,elementsChem, params,pointsRep,domainVec_.at(FElocSolid)->getElementMap());
721 else if(assemblyFEElements_.size() != elementsChem->numberElements())
722 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Number Elements not the same as number assembleFE elements." );
726 MultiVectorPtr_Type resVec_c = Teuchos::rcp(
new MultiVector_Type( domainVec_.at(FElocChem)->getMapRepeated(), 1 ) );
727 MultiVectorPtr_Type resVec_d = Teuchos::rcp(
new MultiVector_Type( domainVec_.at(FElocSolid)->getMapVecFieldRepeated(), 1 ) );
729 BlockMultiVectorPtr_Type resVecRep = Teuchos::rcp(
new BlockMultiVector_Type( 2) );
730 resVecRep->addBlock(resVec_d,0);
731 resVecRep->addBlock(resVec_c,1);
739 for (UN T=0; T<assemblyFEElements_.size(); T++) {
740 vec_dbl_Type solution(0);
742 solution_c = getSolution(elementsChem->getElement(T).getVectorNodeList(), c_rep,dofsChem);
743 solution_d = getSolution(elementsSolid->getElement(T).getVectorNodeList(), d_rep,dofsSolid);
746 solution.insert( solution.end(), solution_d.begin(), solution_d.end() );
747 solution.insert( solution.end(), solution_c.begin(), solution_c.end() );
749 assemblyFEElements_[T]->updateSolution(solution);
751 SmallMatrixPtr_Type elementMatrix;
763 if(assembleMode ==
"Jacobian"){
764 assemblyFEElements_[T]->assembleJacobian();
766 elementMatrix = assemblyFEElements_[T]->getJacobian();
768 assemblyFEElements_[T]->advanceNewtonStep();
770 addFeBlockMatrix(A, elementMatrix, elementsSolid->getElement(T), elementsSolid->getElement(T), mapSolid, mapChem, problemDisk);
775 if(assembleMode ==
"Rhs"){
776 assemblyFEElements_[T]->assembleRHS();
777 rhsVec = assemblyFEElements_[T]->getRHS();
778 addFeBlockMv(resVecRep, rhsVec, elementsSolid->getElement(T),elementsChem->getElement(T), dofsSolid,dofsChem);
781 if(assembleMode==
"MassMatrix"){
782 assemblyFEElements_[T]->assembleJacobian();
784 AssembleFE_SCI_SMC_Active_Growth_Reorientation_Ptr_Type elTmp = Teuchos::rcp_dynamic_cast<AssembleFE_SCI_SMC_Active_Growth_Reorientation_Type>(assemblyFEElements_[T] );
785 elTmp->getMassMatrix(elementMatrix);
787 addFeBlock(A, elementMatrix, elementsChem->getElement(T), mapChem, 0, 0, problemDiskChem);
796 if ( assembleMode ==
"Jacobian"){
797 A->getBlock(0,0)->fillComplete();
798 A->getBlock(1,0)->fillComplete(domainVec_.at(FElocSolid)->getMapVecFieldUnique(),domainVec_.at(FElocChem)->getMapUnique());
799 A->getBlock(0,1)->fillComplete(domainVec_.at(FElocChem)->getMapUnique(),domainVec_.at(FElocSolid)->getMapVecFieldUnique());
800 A->getBlock(1,1)->fillComplete();
802 else if(assembleMode ==
"Rhs"){
804 MultiVectorPtr_Type resVecUnique_d = Teuchos::rcp(
new MultiVector_Type( domainVec_.at(FElocSolid)->getMapVecFieldUnique(), 1 ) );
805 MultiVectorPtr_Type resVecUnique_c = Teuchos::rcp(
new MultiVector_Type( domainVec_.at(FElocChem)->getMapUnique(), 1 ) );
807 resVecUnique_d->putScalar(0.);
808 resVecUnique_c->putScalar(0.);
810 resVecUnique_d->exportFromVector( resVec_d,
true,
"Add" );
811 resVecUnique_c->exportFromVector( resVec_c,
true,
"Add" );
813 resVec->addBlock(resVecUnique_d,0);
814 resVec->addBlock(resVecUnique_c,1);
816 else if(assembleMode ==
"MassMatrix"){
817 A->getBlock(0,0)->fillComplete();
823template <
class SC,
class LO,
class GO,
class NO>
825 std::string FETypeChem,
826 std::string FETypeSolid,
830 MultiVectorPtr_Type c_rep,
831 MultiVectorPtr_Type d_rep,
832 BlockMatrixPtr_Type &A,
835 BlockMultiVectorPtr_Type &resVec,
837 ParameterListPtr_Type params,
838 std::string assembleMode,
839 bool callFillComplete,
842 if((FETypeChem !=
"P2") || (FETypeSolid !=
"P2") || dim != 3)
843 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"No AceGen Implementation available for Discretization and Dimension." );
844 if((blockRow != blockCol) && blockRow != 0)
845 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Block assemblyDeformDiffu AceGEN Version only implemented for 0,0 block right now" );
850 ElementsPtr_Type elementsChem= domainVec_.at(FElocSolid)->getElementsC();
852 ElementsPtr_Type elementsSolid = domainVec_.at(FElocSolid)->getElementsC();
858 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FElocSolid)->getPointsRepeated();
862 MapConstPtr_Type mapSolid = domainVec_.at(FElocSolid)->getMapRepeated();
864 vec_dbl_Type solution_c;
865 vec_dbl_Type solution_d;
867 vec_dbl_ptr_Type rhsVec;
872 if(FETypeChem ==
"P2"){
877 if(FETypeChem ==
"P2")
881 if(FETypeSolid ==
"P2")
886 if(FETypeSolid ==
"P2")
889 tuple_disk_vec_ptr_Type problemDisk = Teuchos::rcp(
new tuple_disk_vec_Type(0));
890 tuple_ssii_Type chem (
"Chemistry",FETypeChem,dofsChem,numChem);
891 tuple_ssii_Type solid (
"Solid",FETypeSolid,dofsSolid,numSolid);
892 problemDisk->push_back(solid);
893 problemDisk->push_back(chem);
895 std::string SCIModel = params->sublist(
"Parameter").get(
"Structure Model",
"SCI_simple");
897 if(assemblyFEElements_.size()== 0){
898 initAssembleFEElements(SCIModel,problemDisk,elementsChem, params,pointsRep,domainVec_.at(FElocSolid)->getElementMap());
900 else if(assemblyFEElements_.size() != elementsChem->numberElements())
901 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Number Elements not the same as number assembleFE elements." );
906 MultiVectorPtr_Type resVec_d = Teuchos::rcp(
new MultiVector_Type( domainVec_.at(FElocSolid)->getMapVecFieldRepeated(), 1 ) );
908 BlockMultiVectorPtr_Type resVecRep = Teuchos::rcp(
new BlockMultiVector_Type( 1) );
909 resVecRep->addBlock(resVec_d,0);
912 for (UN T=0; T<assemblyFEElements_.size(); T++) {
913 vec_dbl_Type solution(0);
915 solution_c = getSolution(elementsChem->getElement(T).getVectorNodeList(), c_rep,dofsChem);
916 solution_d = getSolution(elementsSolid->getElement(T).getVectorNodeList(), d_rep,dofsSolid);
919 solution.insert( solution.end(), solution_d.begin(), solution_d.end() );
920 solution.insert( solution.end(), solution_c.begin(), solution_c.end() );
922 assemblyFEElements_[T]->updateSolution(solution);
924 SmallMatrixPtr_Type elementMatrix;
926 if(assembleMode ==
"Jacobian"){
927 assemblyFEElements_[T]->assembleJacobian();
929 elementMatrix = assemblyFEElements_[T]->getJacobian();
931 assemblyFEElements_[T]->advanceNewtonStep();
932 addFeBlock(A, elementMatrix, elementsSolid->getElement(T), mapSolid, 0, 0, problemDisk);
935 if(assembleMode ==
"Rhs"){
936 assemblyFEElements_[T]->assembleRHS();
937 rhsVec = assemblyFEElements_[T]->getRHS();
938 addFeBlockMv(resVecRep, rhsVec, elementsSolid->getElement(T), dofsSolid);
947 if ( assembleMode !=
"Rhs"){
948 A->getBlock(0,0)->fillComplete();
954 if(assembleMode ==
"Rhs"){
956 MultiVectorPtr_Type resVecUnique_d = Teuchos::rcp(
new MultiVector_Type( domainVec_.at(FElocSolid)->getMapVecFieldUnique(), 1 ) );
959 resVecUnique_d->putScalar(0.);
962 resVecUnique_d->exportFromVector( resVec_d,
true,
"Add" );
965 resVec->addBlock(resVecUnique_d,0);
983template <
class SC,
class LO,
class GO,
class NO>
984void 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){
986 int numDisk = problemDisk->size();
988 int dofs1 = std::get<2>(problemDisk->at(0));
989 int dofs2 = std::get<2>(problemDisk->at(1));
991 int numNodes1 = std::get<3>(problemDisk->at(0));
992 int numNodes2=std::get<3>(problemDisk->at(1));
994 int dofsBlock1 = dofs1*numNodes1;
995 int dofsBlock2 = dofs2*numNodes2;
997 Teuchos::Array<SC> value1( numNodes1, 0. );
998 Teuchos::Array<GO> columnIndices1( numNodes1, 0 );
1000 Teuchos::Array<SC> value2( numNodes2, 0. );
1001 Teuchos::Array<GO> columnIndices2( numNodes2, 0 );
1003 for (UN i=0; i < numNodes1 ; i++) {
1004 for(
int di=0; di<dofs1; di++){
1005 GO row =GO (dofs1* mapFirstRow->getGlobalElement( element1.getNode(i) )+di);
1006 for(
int d=0; d<dofs1; d++){
1007 for (UN j=0; j < columnIndices1.size(); j++){
1008 columnIndices1[j] = GO ( dofs1 * mapFirstRow->getGlobalElement( element1.getNode(j) ) + d );
1009 value1[j] = (*elementMatrix)[dofs1*i+di][dofs1*j+d];
1011 A->getBlock(0,0)->insertGlobalValues( row, columnIndices1(), value1() );
1015 int offset= numNodes1*dofs1;
1018 Teuchos::Array<SC> value( 1, 0. );
1019 Teuchos::Array<GO> columnIndex( 1, 0 );
1020 for (UN i=0; i < numNodes2 ; i++) {
1021 for(
int di=0; di<dofs2; di++){
1022 GO row =GO (dofs2* mapSecondRow->getGlobalElement( element2.getNode(i) )+di);
1023 for(
int d=0; d<dofs2; d++){
1024 for (UN j=0; j < columnIndices2.size(); j++){
1025 double tmpValue = (*elementMatrix)[offset+dofs2*i+di][offset+dofs2*j+d];
1026 if(std::fabs(tmpValue) > 1.e-13){
1027 columnIndex[0] = GO ( dofs2 * mapSecondRow->getGlobalElement( element2.getNode(j) ) + d );
1028 value[0] = tmpValue;
1029 A->getBlock(1,1)->insertGlobalValues( row, columnIndex(), value() );
1037 for (UN i=0; i < numNodes1; i++){
1038 for(
int di=0; di<dofs1; di++){
1039 GO row =GO (dofs1* mapFirstRow->getGlobalElement( element1.getNode(i) )+di);
1040 for(
int d=0; d<dofs2; d++){
1041 for (UN j=0; j < numNodes2 ; j++) {
1042 value2[j] = (*elementMatrix)[i*dofs1+di][offset+j*dofs2+d];
1043 columnIndices2[j] =GO (dofs2* mapSecondRow->getGlobalElement( element2.getNode(j) )+d);
1045 A->getBlock(0,1)->insertGlobalValues( row, columnIndices2(), value2() );
1050 for (UN j=0; j < numNodes2; j++){
1051 for(
int di=0; di<dofs2; di++){
1052 GO row = GO (dofs2* mapSecondRow->getGlobalElement( element2.getNode(j) ) +di );
1053 for(
int d=0; d<dofs1; d++){
1054 for (UN i=0; i < numNodes1 ; i++) {
1055 value1[i] = (*elementMatrix)[offset+j*dofs2+di][dofs1*i+d];
1056 columnIndices1[i] =GO (dofs1* mapFirstRow->getGlobalElement( element1.getNode(i) )+d);
1058 A->getBlock(1,0)->insertGlobalValues( row, columnIndices1(), value1() );
1079template <
class SC,
class LO,
class GO,
class NO>
1081 std::string FETypeVelocity,
1082 std::string FETypePressure,
1086 MultiVectorPtr_Type u_rep,
1087 MultiVectorPtr_Type p_rep,
1088 BlockMatrixPtr_Type &A,
1089 BlockMultiVectorPtr_Type &resVec,
1090 SmallMatrix_Type coeff,
1091 ParameterListPtr_Type params,
1093 std::string assembleMode,
1094 bool callFillComplete,
1098 UN FElocVel = checkFE(dim,FETypeVelocity);
1099 UN FElocPres = checkFE(dim,FETypePressure);
1101 ElementsPtr_Type elements = domainVec_.at(FElocVel)->getElementsC();
1103 ElementsPtr_Type elementsPres = domainVec_.at(FElocPres)->getElementsC();
1105 int dofsElement = elements->getElement(0).getVectorNodeList().size();
1107 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FElocVel)->getPointsRepeated();
1109 MapConstPtr_Type mapVel = domainVec_.at(FElocVel)->getMapRepeated();
1111 MapConstPtr_Type mapPres = domainVec_.at(FElocPres)->getMapRepeated();
1113 vec_dbl_Type solution(0);
1114 vec_dbl_Type solution_u;
1115 vec_dbl_Type solution_p;
1117 vec_dbl_ptr_Type rhsVec;
1122 if(FETypeVelocity ==
"P2")
1127 if(FETypeVelocity ==
"P2")
1130 tuple_disk_vec_ptr_Type problemDisk = Teuchos::rcp(
new tuple_disk_vec_Type(0));
1131 tuple_ssii_Type vel (
"Velocity",FETypeVelocity,dofsVelocity,numVelo);
1132 tuple_ssii_Type pres (
"Pressure",FETypePressure,dofsPressure,dim+1);
1133 problemDisk->push_back(vel);
1134 problemDisk->push_back(pres);
1136 if(assemblyFEElements_.size()== 0){
1137 if(params->sublist(
"Material").get(
"Newtonian",
true) ==
false)
1138 initAssembleFEElements(
"GeneralizedNewtonian",problemDisk,elements, params,pointsRep,domainVec_.at(FElocVel)->getElementMap());
1140 initAssembleFEElements(
"NavierStokes",problemDisk,elements, params,pointsRep,domainVec_.at(FElocVel)->getElementMap());
1142 else if(assemblyFEElements_.size() != elements->numberElements())
1143 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Number Elements not the same as number assembleFE elements." );
1147 MultiVectorPtr_Type resVec_u = Teuchos::rcp(
new MultiVector_Type( domainVec_.at(FElocVel)->getMapVecFieldRepeated(), 1 ) );
1148 MultiVectorPtr_Type resVec_p = Teuchos::rcp(
new MultiVector_Type( domainVec_.at(FElocPres)->getMapRepeated(), 1 ) );
1150 BlockMultiVectorPtr_Type resVecRep = Teuchos::rcp(
new BlockMultiVector_Type( 2) );
1151 resVecRep->addBlock(resVec_u,0);
1152 resVecRep->addBlock(resVec_p,1);
1155 for (UN T=0; T<assemblyFEElements_.size(); T++) {
1156 vec_dbl_Type solution(0);
1158 solution_u = getSolution(elements->getElement(T).getVectorNodeList(), u_rep,dofsVelocity);
1159 solution_p = getSolution(elementsPres->getElement(T).getVectorNodeList(), p_rep,dofsPressure);
1161 solution.insert( solution.end(), solution_u.begin(), solution_u.end() );
1162 solution.insert( solution.end(), solution_p.begin(), solution_p.end() );
1164 assemblyFEElements_[T]->updateSolution(solution);
1166 SmallMatrixPtr_Type elementMatrix;
1168 if(assembleMode ==
"Jacobian"){
1169 assemblyFEElements_[T]->assembleJacobian();
1171 elementMatrix = assemblyFEElements_[T]->getJacobian();
1173 assemblyFEElements_[T]->advanceNewtonStep();
1176 addFeBlock(A, elementMatrix, elements->getElement(T), mapVel, 0, 0, problemDisk);
1178 addFeBlockMatrix(A, elementMatrix, elements->getElement(T), elementsPres->getElement(T), mapVel, mapPres, problemDisk);
1180 if(assembleMode ==
"FixedPoint"){
1184 if(params->sublist(
"Material").get(
"Newtonian",
true) ==
false)
1186 AssembleFEGeneralizedNewtonianPtr_Type elTmp = Teuchos::rcp_dynamic_cast<AssembleFEGeneralizedNewtonian_Type>( assemblyFEElements_[T] );
1187 elTmp->assembleFixedPoint();
1188 elementMatrix = elTmp->getFixedPointMatrix();
1192 AssembleFENavierStokesPtr_Type elTmp = Teuchos::rcp_dynamic_cast<AssembleFENavierStokes_Type>( assemblyFEElements_[T] );
1193 elTmp->assembleFixedPoint();
1194 elementMatrix = elTmp->getFixedPointMatrix();
1198 assemblyFEElements_[T]->advanceNewtonStep();
1201 addFeBlock(A, elementMatrix, elements->getElement(T), mapVel, 0, 0, problemDisk);
1203 addFeBlockMatrix(A, elementMatrix, elements->getElement(T), elementsPres->getElement(T),mapVel, mapPres, problemDisk);
1206 if(assembleMode ==
"Rhs"){
1207 AssembleFENavierStokesPtr_Type elTmp = Teuchos::rcp_dynamic_cast<AssembleFENavierStokes_Type>(assemblyFEElements_[T] );
1208 elTmp->setCoeff(coeff);
1209 assemblyFEElements_[T]->assembleRHS();
1210 rhsVec = assemblyFEElements_[T]->getRHS();
1211 addFeBlockMv(resVecRep, rhsVec, elements->getElement(T),elementsPres->getElement(T), dofsVelocity,dofsPressure);
1216 if (callFillComplete && reAssemble && assembleMode !=
"Rhs" )
1217 A->getBlock(0,0)->fillComplete( domainVec_.at(FElocVel)->getMapVecFieldUnique(),domainVec_.at(FElocVel)->getMapVecFieldUnique());
1218 else if(callFillComplete && !reAssemble && assembleMode !=
"Rhs"){
1219 A->getBlock(0,0)->fillComplete();
1220 A->getBlock(1,0)->fillComplete(domainVec_.at(FElocVel)->getMapVecFieldUnique(),domainVec_.at(FElocPres)->getMapUnique());
1221 A->getBlock(0,1)->fillComplete(domainVec_.at(FElocPres)->getMapUnique(),domainVec_.at(FElocVel)->getMapVecFieldUnique());
1224 if(assembleMode ==
"Rhs"){
1226 MultiVectorPtr_Type resVecUnique_u = Teuchos::rcp(
new MultiVector_Type( domainVec_.at(FElocVel)->getMapVecFieldUnique(), 1 ) );
1227 MultiVectorPtr_Type resVecUnique_p = Teuchos::rcp(
new MultiVector_Type( domainVec_.at(FElocPres)->getMapUnique(), 1 ) );
1229 resVecUnique_u->putScalar(0.);
1230 resVecUnique_p->putScalar(0.);
1232 resVecUnique_u->exportFromVector( resVec_u,
true,
"Add" );
1233 resVecUnique_p->exportFromVector( resVec_p,
true,
"Add" );
1235 resVec->addBlock(resVecUnique_u,0);
1236 resVec->addBlock(resVecUnique_p,1);
1253template <
class SC,
class LO,
class GO,
class NO>
1255 std::string FETypeVelocity,
1256 std::string FETypePressure,
1259 MultiVectorPtr_Type u_rep,
1260 MultiVectorPtr_Type p_rep,
1261 ParameterListPtr_Type params){
1264 UN FElocVel = checkFE(dim,FETypeVelocity);
1265 UN FElocPres = checkFE(dim,FETypePressure);
1267 ElementsPtr_Type elements = domainVec_.at(FElocVel)->getElementsC();
1268 ElementsPtr_Type elementsPres = domainVec_.at(FElocPres)->getElementsC();
1270 vec_dbl_Type solution(0);
1271 vec_dbl_Type solution_u;
1272 vec_dbl_Type solution_p;
1273 vec_dbl_Type solution_viscosity;
1276 MultiVectorPtr_Type Sol_viscosity = Teuchos::rcp(
new MultiVector_Type( domainVec_.at(FElocVel)->getElementMap(), 1 ) );
1277 BlockMultiVectorPtr_Type visco_output = Teuchos::rcp(
new BlockMultiVector_Type(1) );
1278 visco_output->addBlock(Sol_viscosity,0);
1281 for (UN T=0; T<assemblyFEElements_.size(); T++) {
1283 vec_dbl_Type solution(0);
1284 solution_u = getSolution(elements->getElement(T).getVectorNodeList(), u_rep,dofsVelocity);
1285 solution_p = getSolution(elementsPres->getElement(T).getVectorNodeList(), p_rep,dofsPressure);
1287 solution.insert( solution.end(), solution_u.begin(), solution_u.end() );
1288 solution.insert( solution.end(), solution_p.begin(), solution_p.end() );
1290 assemblyFEElements_[T]->updateSolution(solution);
1292 assemblyFEElements_[T]->computeLocalconstOutputField();
1293 solution_viscosity = assemblyFEElements_[T]->getLocalconstOutputField();
1295 Teuchos::ArrayRCP<SC> resArray_block = visco_output->getBlockNonConst(0)->getDataNonConst(0);
1296 resArray_block[T] = solution_viscosity[0];
1300 this->const_output_fields= visco_output;
1318template <
class SC,
class LO,
class GO,
class NO>
1319void FE<SC,LO,GO,NO>::addFeBlockMv(BlockMultiVectorPtr_Type &res, vec_dbl_ptr_Type rhsVec,
FiniteElement elementBlock1,
FiniteElement elementBlock2,
int dofs1,
int dofs2 ){
1321 Teuchos::ArrayRCP<SC> resArray_block1 = res->getBlockNonConst(0)->getDataNonConst(0);
1323 Teuchos::ArrayRCP<SC> resArray_block2 = res->getBlockNonConst(1)->getDataNonConst(0);
1325 vec_LO_Type nodeList_block1 = elementBlock1.getVectorNodeList();
1327 vec_LO_Type nodeList_block2 = elementBlock2.getVectorNodeList();
1329 for(
int i=0; i< nodeList_block1.size() ; i++){
1330 for(
int d=0; d<dofs1; d++){
1331 resArray_block1[nodeList_block1[i]*dofs1+d] += (*rhsVec)[i*dofs1+d];
1334 int offset = nodeList_block1.size()*dofs1;
1336 for(
int i=0; i < nodeList_block2.size(); i++){
1337 for(
int d=0; d<dofs2; d++)
1338 resArray_block2[nodeList_block2[i]*dofs2+d] += (*rhsVec)[i*dofs2+d+offset];
1356template <
class SC,
class LO,
class GO,
class NO>
1357void 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){
1359 int dofs1 = std::get<2>(problemDisk->at(row));
1361 int numNodes1 = std::get<3>(problemDisk->at(row));
1363 int dofsBlock1 = dofs1*numNodes1;
1365 Teuchos::Array<SC> value( numNodes1, 0. );
1366 Teuchos::Array<GO> columnIndices( numNodes1, 0 );
1368 for (UN i=0; i < numNodes1 ; i++) {
1369 for(
int di=0; di<dofs1; di++){
1370 GO rowID =GO (dofs1* mapRow->getGlobalElement( element.getNode(i) )+di);
1371 for(
int d=0; d<dofs1; d++){
1372 for (UN j=0; j < columnIndices.size(); j++){
1373 columnIndices[j] = GO ( dofs1 * mapRow->getGlobalElement( element.getNode(j) ) + d );
1374 value[j] = (*elementMatrix)[dofs1*i+di][dofs1*j+d];
1376 A->getBlock(row,column)->insertGlobalValues( rowID, columnIndices(), value() );
1392template <
class SC,
class LO,
class GO,
class NO>
1393void 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){
1395 vec2D_dbl_Type nodes;
1396 for (UN T=0; T<elements->numberElements(); T++) {
1398 nodes = getCoordinates(elements->getElement(T).getVectorNodeList(), pointsRep);
1400 AssembleFEFactory<SC,LO,GO,NO> assembleFEFactory;
1402 AssembleFEPtr_Type assemblyFE = assembleFEFactory.build(elementType,elements->getElement(T).getFlag(),nodes, params,problemDisk);
1404 assemblyFE->setGlobalElementID(elementMap->getGlobalElement(T));
1406 assemblyFEElements_.push_back(assemblyFE);
1422template <
class SC,
class LO,
class GO,
class NO>
1423vec2D_dbl_Type FE<SC,LO,GO,NO>::getCoordinates(vec_LO_Type localIDs, vec2D_dbl_ptr_Type points){
1425 vec2D_dbl_Type coordinates(0,vec_dbl_Type( points->at(0).size()));
1426 for(
int i=0; i < localIDs.size() ; i++){
1427 coordinates.push_back(points->at(localIDs[i]));
1443template <
class SC,
class LO,
class GO,
class NO>
1444vec_dbl_Type FE<SC,LO,GO,NO>::getSolution(vec_LO_Type localIDs, MultiVectorPtr_Type u_rep,
int dofsVelocity){
1446 Teuchos::ArrayRCP<SC> uArray = u_rep->getDataNonConst(0);
1448 vec_dbl_Type solution(0);
1449 for(
int i=0; i < localIDs.size() ; i++){
1450 for(
int d=0; d<dofsVelocity; d++)
1451 solution.push_back(uArray[localIDs[i]*dofsVelocity+d]);
1458template <
class SC,
class LO,
class GO,
class NO>
1459void FE<SC,LO,GO,NO>::applyBTinv( vec3D_dbl_ptr_Type& dPhiIn,
1460 vec3D_dbl_Type& dPhiOut,
1461 const SmallMatrix<SC>& Binv){
1462 UN dim = Binv.size();
1463 for (UN w=0; w<dPhiIn->size(); w++){
1464 for (UN i=0; i < dPhiIn->at(w).size(); i++) {
1465 for (UN d1=0; d1<dim; d1++) {
1466 for (UN d2=0; d2<dim; d2++) {
1467 dPhiOut[w][i][d1] += dPhiIn->at(w).at(i).at(d2) * Binv[d2][d1];
1474template <
class SC,
class LO,
class GO,
class NO>
1475void FE<SC,LO,GO,NO>::assemblyEmptyMatrix(MatrixPtr_Type &A){
1478template <
class SC,
class LO,
class GO,
class NO>
1479void FE<SC,LO,GO,NO>::assemblyIdentity(MatrixPtr_Type &A){
1480 Teuchos::Array<SC> value(1, Teuchos::ScalarTraits<SC>::one() );
1481 Teuchos::Array<GO> index(1);
1482 MapConstPtr_Type map = A->getMap();
1483 for (
int i=0; i<A->getNodeNumRows(); i++) {
1484 index[0] = map->getGlobalElement( i );
1485 A->insertGlobalValues( index[0], index(), value() );
1491template <
class SC,
class LO,
class GO,
class NO>
1492void FE<SC,LO,GO,NO>::assemblySurfaceRobinBC(
int dim,
1493 std::string FETypeP,
1494 std::string FETypeV,
1495 MultiVectorPtr_Type u,
1497 std::vector<SC>& funcParameter,
1499 ParameterListPtr_Type parameters){
1501 ElementsPtr_Type elements = domainVec_.at(1)->getElementsC();
1502 ElementsPtr_Type elementsV = domainVec_.at(0)->getElementsC();
1504 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(1)->getPointsRepeated();
1506 MapConstPtr_Type map = domainVec_.at(1)->getMapRepeated();
1508 vec2D_dbl_ptr_Type phi,phiV;
1509 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
1512 UN extraDeg = Helper::determineDegree( dim-1, FETypeV, Helper::Deriv0);
1513 UN deg = Helper::determineDegree( dim-1, FETypeP, Helper::Deriv0)*2 + extraDeg;
1516 Helper::getPhi(phi, weights, dim-1, FETypeP, deg);
1517 Helper::getPhi(phiV, weights, dim-1, FETypeV, deg);
1521 SmallMatrix<SC> B(dim);
1524 vec2D_dbl_Type uLoc( dim, vec_dbl_Type( weights->size() , -1. ) );
1525 vec_dbl_Type uLocN( weights->size() , -1. );
1527 Teuchos::ArrayRCP< const SC > uArray = u->getData(0);
1531 vec_dbl_Type b(dim);
1533 std::vector<double> valueFunc(dim);
1535 SC* paramsFunc = &(funcParameter[0]);
1536 for (UN T=0; T<elements->numberElements(); T++) {
1537 FiniteElement fe = elementsV->getElement( T );
1538 ElementsPtr_Type subEl = fe.getSubElements();
1539 for (
int surface=0; surface<fe.numSubElements(); surface++) {
1540 FiniteElement feSub = subEl->getElement( surface );
1541 if(subEl->getDimension() == dim-1){
1544 vec_int_Type nodeList = feSub.getVectorNodeListNonConst();
1545 vec_int_Type nodeListP = elements->getElement(T).getSubElements()->getElement(surface).getVectorNodeListNonConst();
1547 vec_dbl_Type v_E(dim,1.);
1549 vec_dbl_Type x(dim,0.);
1550 paramsFunc[ funcParameter.size() - 1 ] = feSub.getFlag();
1552 func( &x[0], &valueFunc[0], paramsFunc);
1553 if(valueFunc[0] > 0.){
1554 Helper::computeSurfaceNormal(dim, pointsRep,nodeListP,v_E,norm_v_E);
1556 Helper::buildTransformationSurface( nodeListP, pointsRep, B, b, FETypeP);
1558 elScaling = B.computeScaling( );
1559 for (
int w=0; w<phiV->size(); w++){
1560 for (
int d=0; d<dim; d++) {
1562 for (
int i=0; i < phiV->at(0).size(); i++) {
1563 LO index = dim * nodeList[i] + d;
1564 uLoc[d][w] += uArray[index] * phiV->at(w).at(i);
1568 for (
int w=0; w<phiV->size(); w++){
1570 for (
int d=0; d<dim; d++) {
1571 uLocN[w] += uLoc[d][w] *v_E[d] / norm_v_E;
1574 for (UN i=0; i < phi->at(0).size(); i++) {
1575 Teuchos::Array<SC> value( phi->at(0).size(), 0. );
1576 Teuchos::Array<GO> indices( phi->at(0).size(), 0 );
1577 for (UN j=0; j < value.size(); j++) {
1578 for (UN w=0; w<phi->size(); w++) {
1579 value[j] += weights->at(w) * uLocN[w]* (*phi)[w][j] * (*phi)[w][i] ;
1581 value[j] *= elScaling;
1582 indices[j] = GO ( map->getGlobalElement( nodeListP[j] ) );
1585 GO row = GO ( map->getGlobalElement( nodeListP[i] ) );
1586 A->insertGlobalValues( row, indices(), value() );
1864template <
class SC,
class LO,
class GO,
class NO>
1869 BlockMatrixPtr_Type &A,
1870 bool callFillComplete,
1872 ParameterListPtr_Type params = Teuchos::getParametersFromXmlFile(
"parametersProblemLaplace.xml");
1874 UN FEloc = checkFE(dim,FEType);
1875 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
1876 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
1877 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
1878 vec2D_dbl_Type nodes;
1885 tuple_disk_vec_ptr_Type problemDisk = Teuchos::rcp(
new tuple_disk_vec_Type(0));
1886 tuple_ssii_Type vel (
"Laplace",FEType,dofs,numNodes);
1887 problemDisk->push_back(vel);
1888 if(assemblyFEElements_.size()== 0)
1889 initAssembleFEElements(
"Laplace",problemDisk,elements, params,pointsRep,domainVec_.at(0)->getElementMap());
1890 else if(assemblyFEElements_.size() != elements->numberElements())
1891 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Number Elements not the same as number assembleFE elements." );
1892 for (UN T=0; T<elements->numberElements(); T++) {
1893 assemblyFEElements_[T]->assembleJacobian();
1894 SmallMatrixPtr_Type elementMatrix = assemblyFEElements_[T]->getJacobian();
1895 addFeBlock(A, elementMatrix, elements->getElement(T), map, 0, 0, problemDisk);
1898 if(callFillComplete)
1899 A->getBlock(0,0)->fillComplete();
1903template <
class SC,
class LO,
class GO,
class NO>
1904void FE<SC,LO,GO,NO>::assemblyLaplaceDiffusion(
int dim,
1908 vec2D_dbl_Type diffusionTensor,
1909 bool callFillComplete,
1911 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
1913 if (FELocExternal<0)
1914 FEloc = checkFE(dim,FEType);
1916 FEloc = FELocExternal;
1918 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
1920 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
1922 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
1924 vec3D_dbl_ptr_Type dPhi;
1925 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
1937 vec_dbl_Type v_i(dim);
1938 vec_dbl_Type v_j(dim);
1943 if(diffusionTensor.size()==0 || diffusionTensor.size() < dim ){
1944 vec2D_dbl_Type diffusionTensor(3,vec_dbl_Type(3,0));
1945 for(
int i=0; i< dim; i++){
1946 diffusionTensor[i][i]=1.;
1950 for(
int i=0; i< dim; i++){
1951 for(
int j=0; j<dim; j++){
1952 diffusionT[i][j]=diffusionTensor[i][j];
1957 for (UN T=0; T<elements->numberElements(); T++) {
1959 Helper::buildTransformation(elements->getElement(T).getVectorNodeList(), pointsRep, B, FEType);
1960 detB = B.computeInverse(Binv);
1961 absDetB = std::fabs(detB);
1963 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
1964 applyBTinv( dPhi, dPhiTrans, Binv );
1966 vec3D_dbl_Type dPhiTransDiff( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
1967 applyDiff( dPhiTrans, dPhiTransDiff, diffusionT );
1969 for (UN i=0; i < dPhiTrans[0].size(); i++) {
1970 Teuchos::Array<SC> value( dPhiTrans[0].size(), 0. );
1971 Teuchos::Array<GO> indices( dPhiTrans[0].size(), 0 );
1973 for (UN j=0; j < value.size(); j++) {
1974 for (UN w=0; w<dPhiTrans.size(); w++) {
1975 for (UN d=0; d<dim; d++){
1976 value[j] += weights->at(w) * dPhiTrans[w][i][d] * dPhiTransDiff[w][j][d];
1979 value[j] *= absDetB;
1980 indices[j] = map->getGlobalElement( elements->getElement(T).getNode(j) );
1981 if (setZeros_ && std::fabs(value[j]) < myeps_) {
1985 GO row = map->getGlobalElement( elements->getElement(T).getNode(i) );
1987 A->insertGlobalValues( row, indices(), value() );
1992 if (callFillComplete)
1997template <
class SC,
class LO,
class GO,
class NO>
1998void FE<SC,LO,GO,NO>::applyDiff( vec3D_dbl_Type& dPhiIn,
1999 vec3D_dbl_Type& dPhiOut,
2000 SmallMatrix<SC>& diffT){
2001 UN dim = diffT.size();
2002 for (UN w=0; w<dPhiIn.size(); w++){
2003 for (UN i=0; i < dPhiIn[w].size(); i++) {
2004 for (UN d1=0; d1<dim; d1++) {
2005 for (UN d2=0; d2<dim; d2++) {
2006 dPhiOut[w][i][d1] += dPhiIn[w][i][d2]* diffT[d2][d1];
2336template <
class SC,
class LO,
class GO,
class NO>
2337void FE<SC,LO,GO,NO>::assemblyMass(
int dim,
2339 std::string fieldType,
2341 bool callFillComplete){
2343 TEUCHOS_TEST_FOR_EXCEPTION( FEType ==
"P0", std::logic_error,
"Not implemented for P0" );
2344 UN FEloc = checkFE(dim,FEType);
2345 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
2347 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
2349 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
2351 vec2D_dbl_ptr_Type phi;
2352 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
2355 UN deg = 2*Helper::determineDegree(dim,FEType,Helper::Deriv0);
2357 Helper::getPhi( phi, weights, dim, FEType, deg );
2361 SmallMatrix<SC> B(dim);
2363 vec_dbl_Type v_i(dim);
2364 vec_dbl_Type v_j(dim);
2366 for (UN T=0; T<elements->numberElements(); T++) {
2368 Helper::buildTransformation(elements->getElement(T).getVectorNodeList(), pointsRep, B,FEType);
2369 detB = B.computeDet( );
2370 absDetB = std::fabs(detB);
2372 for (UN i=0; i < phi->at(0).size(); i++) {
2373 Teuchos::Array<SC> value( phi->at(0).size(), 0. );
2374 Teuchos::Array<GO> indices( phi->at(0).size(), 0 );
2375 for (UN j=0; j < value.size(); j++) {
2376 for (UN w=0; w<phi->size(); w++) {
2377 value[j] += weights->at(w) * (*phi)[w][i] * (*phi)[w][j];
2380 value[j] *= absDetB;
2381 if (!fieldType.compare(
"Scalar")) {
2382 indices[j] = map->getGlobalElement( elements->getElement(T).getNode(j) );
2386 if (!fieldType.compare(
"Scalar")) {
2387 GO row = map->getGlobalElement( elements->getElement(T).getNode(i) );
2388 A->insertGlobalValues( row, indices(), value() );
2390 else if (!fieldType.compare(
"Vector")) {
2391 for (UN d=0; d<dim; d++) {
2392 for (
int j=0; j<indices.size(); j++) {
2393 indices[j] = (GO) ( dim * map->getGlobalElement( elements->getElement(T).getNode(j) ) + d );
2395 GO row = (GO) ( dim * map->getGlobalElement( elements->getElement(T).getNode(i) ) + d );
2396 A->insertGlobalValues( row, indices(), value() );
2400 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Specify valid vieldType for assembly of mass matrix.");
2405 if (callFillComplete)
2413template <
class SC,
class LO,
class GO,
class NO>
2414void FE<SC,LO,GO,NO>::assemblyMass(
int dim,
2416 std::string fieldType,
2419 bool callFillComplete){
2421 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
2423 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
2425 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
2427 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
2429 vec2D_dbl_ptr_Type phi;
2430 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
2433 UN deg = 2*Helper::determineDegree(dim,FEType,Helper::Deriv0);
2435 Helper::getPhi( phi, weights, dim, FEType, deg );
2439 SmallMatrix<SC> B(dim);
2441 vec_dbl_Type v_i(dim);
2442 vec_dbl_Type v_j(dim);
2444 for (UN T=0; T<elements->numberElements(); T++) {
2446 Helper::buildTransformation(elements->getElement(T).getVectorNodeList(), pointsRep, B,FEType);
2447 detB = B.computeDet( );
2448 absDetB = std::fabs(detB);
2450 for (UN i=0; i < phi->at(0).size(); i++) {
2451 Teuchos::Array<SC> value( phi->at(0).size(), 0. );
2452 Teuchos::Array<GO> indices( phi->at(0).size(), 0 );
2453 for (UN j=0; j < value.size(); j++) {
2454 for (UN w=0; w<phi->size(); w++) {
2455 value[j] += weights->at(w) * (*phi)[w][i] * (*phi)[w][j];
2457 value[j] *= absDetB;
2458 if (!fieldType.compare(
"Scalar")) {
2459 indices[j] = map->getGlobalElement( elements->getElement(T).getNode(j) );
2463 if (!fieldType.compare(
"Scalar")) {
2464 GO row = map->getGlobalElement( elements->getElement(T).getNode(i) );
2465 A->insertGlobalValues( row, indices(), value() );
2467 else if (!fieldType.compare(
"Vector")) {
2468 for (UN d=0; d<dim; d++) {
2469 for (
int j=0; j<indices.size(); j++) {
2470 indices[j] = (GO) ( dim * map->getGlobalElement( elements->getElement(T).getNode(j) ) + d );
2472 GO row = (GO) ( dim * map->getGlobalElement( elements->getElement(T).getNode(i) ) + d );
2473 A->insertGlobalValues( row, indices(), value() );
2477 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Specify valid vieldType for assembly of mass matrix.");
2482 if (callFillComplete)
2487template <
class SC,
class LO,
class GO,
class NO>
2488void FE<SC,LO,GO,NO>::assemblyLaplace(
int dim,
2492 bool callFillComplete,
2494 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
2496 if (FELocExternal<0)
2497 FEloc = checkFE(dim,FEType);
2499 FEloc = FELocExternal;
2501 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
2503 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
2505 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
2507 vec3D_dbl_ptr_Type dPhi;
2508 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
2510 UN deg = 2*Helper::determineDegree(dim,FEType,Helper::Deriv1);
2511 Helper::getDPhi(dPhi, weights, dim, FEType, deg);
2515 SmallMatrix<SC> B(dim);
2516 SmallMatrix<SC> Binv(dim);
2518 vec_dbl_Type v_i(dim);
2519 vec_dbl_Type v_j(dim);
2521 for (UN T=0; T<elements->numberElements(); T++) {
2523 Helper::buildTransformation(elements->getElement(T).getVectorNodeList(), pointsRep, B, FEType);
2524 detB = B.computeInverse(Binv);
2525 absDetB = std::fabs(detB);
2527 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
2528 applyBTinv( dPhi, dPhiTrans, Binv );
2529 for (UN i=0; i < dPhiTrans[0].size(); i++) {
2530 Teuchos::Array<SC> value( dPhiTrans[0].size(), 0. );
2531 Teuchos::Array<GO> indices( dPhiTrans[0].size(), 0 );
2532 for (UN j=0; j < value.size(); j++) {
2533 for (UN w=0; w<dPhiTrans.size(); w++) {
2534 for (UN d=0; d<dim; d++){
2535 value[j] += weights->at(w) * dPhiTrans[w][i][d] * dPhiTrans[w][j][d];
2538 value[j] *= absDetB;
2539 indices[j] = map->getGlobalElement( elements->getElement(T).getNode(j) );
2541 GO row = map->getGlobalElement( elements->getElement(T).getNode(i) );
2543 A->insertGlobalValues( row, indices(), value() );
2548 if (callFillComplete)
2553template <
class SC,
class LO,
class GO,
class NO>
2554void FE<SC,LO,GO,NO>::assemblyLaplaceVecField(
int dim,
2558 bool callFillComplete){
2560 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P1-disc" || FEType ==
"P0",std::logic_error,
"Not implemented for P0 or P1-disc");
2561 UN FEloc = checkFE(dim,FEType);
2563 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
2565 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
2567 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
2569 vec3D_dbl_ptr_Type dPhi;
2570 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
2572 UN deg = 2*Helper::determineDegree(dim,FEType,Helper::Deriv1);
2574 Helper::getDPhi(dPhi, weights, dim, FEType, deg);
2578 SmallMatrix<SC> B(dim);
2579 SmallMatrix<SC> Binv(dim);
2581 vec_dbl_Type v_i(dim);
2582 vec_dbl_Type v_j(dim);
2585 for (UN T=0; T<elements->numberElements(); T++) {
2587 Helper::buildTransformation(elements->getElement(T).getVectorNodeList(), pointsRep, B, FEType);
2588 detB = B.computeInverse(Binv);
2589 absDetB = std::fabs(detB);
2591 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
2592 applyBTinv( dPhi, dPhiTrans, Binv );
2594 for (UN i=0; i < dPhiTrans[0].size(); i++) {
2595 Teuchos::Array<SC> value( dPhiTrans[0].size(), 0. );
2596 Teuchos::Array<GO> indices( dPhiTrans[0].size(), 0 );
2597 for (UN j=0; j < value.size(); j++) {
2598 for (UN w=0; w<dPhiTrans.size(); w++) {
2599 for (UN d=0; d<dim; d++)
2600 value[j] += weights->at(w) * dPhiTrans[w][i][d] * dPhiTrans[w][j][d];
2602 value[j] *= absDetB;
2603 if (setZeros_ && std::fabs(value[j]) < myeps_) {
2607 for (UN d=0; d<dim; d++) {
2608 for (UN j=0; j < indices.size(); j++)
2609 indices[j] = GO ( dim * map->getGlobalElement( elements->getElement(T).getNode(j) ) + d );
2611 GO row = GO ( dim * map->getGlobalElement( elements->getElement(T).getNode(i) ) + d );
2612 A->insertGlobalValues( row, indices(), value() );
2616 if (callFillComplete)
2620template <
class SC,
class LO,
class GO,
class NO>
2621void FE<SC,LO,GO,NO>::assemblyLaplaceVecFieldV2(
int dim,
2625 bool callFillComplete){
2627 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
2628 UN FEloc = checkFE(dim,FEType);
2630 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
2632 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
2634 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
2636 vec3D_dbl_ptr_Type dPhi;
2637 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
2639 UN deg = 2*Helper::determineDegree(dim,FEType,Helper::Deriv1);
2641 Helper::getDPhi(dPhi, weights, dim, FEType, deg);
2643 Teuchos::BLAS<int, SC> teuchosBLAS;
2645 int nmbQuadPoints = dPhi->size();
2646 int nmbScalarDPhi = dPhi->at(0).size();
2647 int nmbAllDPhi = nmbScalarDPhi * dim;
2648 int nmbAllDPhiAllQaud = nmbQuadPoints * nmbAllDPhi;
2649 int sizeLocStiff = dim*dim;
2650 Teuchos::Array<SmallMatrix<double> > dPhiMat( nmbAllDPhiAllQaud, SmallMatrix<double>(dim) );
2651 this->buildFullDPhi( dPhi, dPhiMat );
2656 SmallMatrix<SC> B(dim);
2657 SmallMatrix<SC> Binv(dim);
2659 vec_dbl_Type v_i(dim);
2660 vec_dbl_Type v_j(dim);
2662 for (UN T=0; T<elements->numberElements(); T++) {
2664 Helper::buildTransformation(elements->getElement(T).getVectorNodeList(), pointsRep, B,FEType);
2665 detB = B.computeInverse(Binv);
2666 absDetB = std::fabs(detB);
2668 Teuchos::Array<SmallMatrix<double> > allDPhiMatTrans( dPhiMat.size(), SmallMatrix<double>() );
2670 for (
int i=0; i<allDPhiMatTrans.size(); i++) {
2671 SmallMatrix<double> res = dPhiMat[i] * Binv;
2672 allDPhiMatTrans[i] = res;
2675 SmallMatrix<double> locStiffMat( nmbAllDPhi, 0. );
2677 for (
int p=0; p<nmbQuadPoints; p++){
2679 double* allDPhiBlas =
new double[ nmbAllDPhi * sizeLocStiff ];
2681 int offset = p * nmbAllDPhi;
2682 int offsetInArray = 0;
2683 for (
int i=0; i<nmbAllDPhi; i++) {
2684 fillMatrixArray( allDPhiMatTrans[ offset + i ], allDPhiBlas,
"rows",offsetInArray );
2685 offsetInArray += sizeLocStiff;
2688 double* locStiffMatBlas =
new double[ nmbAllDPhi * nmbAllDPhi ];
2690 teuchosBLAS.GEMM (Teuchos::TRANS, Teuchos::NO_TRANS, nmbAllDPhi, nmbAllDPhi, sizeLocStiff, 1., allDPhiBlas, sizeLocStiff, allDPhiBlas, sizeLocStiff, 0., locStiffMatBlas, nmbAllDPhi);
2692 for (
int i=0; i<nmbAllDPhi; i++) {
2693 for (
int j=0; j<nmbAllDPhi; j++) {
2694 locStiffMat[i][j] += weights->at(p) * locStiffMatBlas[ j * nmbAllDPhi + i ];
2698 delete [] allDPhiBlas;
2699 delete [] locStiffMatBlas;
2703 for (UN i=0; i < nmbScalarDPhi; i++) {
2704 Teuchos::Array<SC> value( nmbAllDPhi, 0. );
2705 Teuchos::Array<GO> indices( nmbAllDPhi, 0 );
2706 for (UN d=0; d<dim; d++) {
2707 for (UN j=0; j < nmbScalarDPhi; j++){
2708 value[ j * dim + d ] = absDetB * locStiffMat[dim * i + d][j];
2709 indices[ j * dim + d ] = GO ( dim * map->getGlobalElement( elements->getElement(T).getNode(j) ) + d );
2711 GO row = GO ( dim * map->getGlobalElement( elements->getElement(T).getNode(i) ) + d );
2712 A->insertGlobalValues( row, indices(), value() );
2716 if (callFillComplete)
2736template <
class SC,
class LO,
class GO,
class NO>
2738 int dim, std::string FEType,
int degree, MultiVectorPtr_Type u_rep,
2739 BlockMatrixPtr_Type &A, BlockMultiVectorPtr_Type &resVec,
2740 ParameterListPtr_Type params, std::string assembleMode,
bool callFillComplete,
2741 int FELocExternal) {
2743 ElementsPtr_Type elements = this->domainVec_.at(0)->getElementsC();
2748 vec2D_dbl_ptr_Type pointsRep = this->domainVec_.at(0)->getPointsRepeated();
2749 MapConstPtr_Type map = this->domainVec_.at(0)->getMapRepeated();
2751 vec_dbl_Type solution_u;
2752 vec_dbl_ptr_Type rhsVec;
2755 if (FEType ==
"P2") {
2760 if (FEType ==
"P2") {
2769 tuple_disk_vec_ptr_Type problemDisk =
2770 Teuchos::rcp(
new tuple_disk_vec_Type(0));
2771 tuple_ssii_Type temp(
"Solution", FEType, dofs, numNodes);
2772 problemDisk->push_back(temp);
2775 if (assemblyFEElements_.size() == 0) {
2776 initAssembleFEElements(
"NonLinearLaplace", problemDisk, elements, params, pointsRep, domainVec_.at(0)->getElementMap());
2777 }
else if (assemblyFEElements_.size() != elements->numberElements()) {
2778 TEUCHOS_TEST_FOR_EXCEPTION(
2779 true, std::logic_error,
2780 "Number Elements not the same as number assembleFE elements.");
2783 MultiVectorPtr_Type resVec_u;
2784 BlockMultiVectorPtr_Type resVecRep;
2786 if (assembleMode !=
"Rhs") {
2790 auto A_block_zero_zero = Teuchos::rcp(
2791 new Matrix_Type(this->domainVec_.at(0)->getMapUnique(), this->domainVec_.at(0)->getApproxEntriesPerRow()));
2793 A->addBlock(A_block_zero_zero, 0, 0);
2796 resVec_u = Teuchos::rcp(
new MultiVector_Type(map, 1));
2797 resVecRep = Teuchos::rcp(
new BlockMultiVector_Type(1));
2798 resVecRep->addBlock(resVec_u, 0);
2801 for (UN T = 0; T < assemblyFEElements_.size(); T++) {
2802 vec_dbl_Type solution(0);
2805 solution_u = getSolution(elements->getElement(T).getVectorNodeList(),
2807 solution.insert(solution.end(), solution_u.begin(), solution_u.end());
2808 assemblyFEElements_[T]->updateSolution(solution);
2810 if (assembleMode ==
"Jacobian") {
2811 SmallMatrixPtr_Type elementMatrix;
2812 assemblyFEElements_[T]->assembleJacobian();
2813 elementMatrix = assemblyFEElements_[T]->getJacobian();
2816 assemblyFEElements_[T]
2817 ->advanceNewtonStep();
2818 addFeBlock(A, elementMatrix, elements->getElement(T), map, 0, 0,
2822 if (assembleMode ==
"Rhs") {
2823 assemblyFEElements_[T]->assembleRHS();
2824 rhsVec = assemblyFEElements_[T]->getRHS();
2829 addFeBlockMv(resVecRep, rhsVec, elements->getElement(T), dofs);
2832 if (callFillComplete && assembleMode !=
"Rhs") {
2835 A->getBlock(0, 0)->fillComplete(domainVec_.at(0)->getMapUnique(),
2836 domainVec_.at(0)->getMapUnique());
2838 if (assembleMode ==
"Rhs") {
2840 MultiVectorPtr_Type resVecUnique = Teuchos::rcp(
2841 new MultiVector_Type(domainVec_.at(0)->getMapUnique(), 1));
2842 resVecUnique->putScalar(0.);
2843 resVecUnique->exportFromVector(resVec_u,
true,
"Add");
2844 resVec->addBlock(resVecUnique, 0);
2849template <
class SC,
class LO,
class GO,
class NO>
2850void FE<SC,LO,GO,NO>::assemblyElasticityJacobianAndStressAceFEM(
int dim,
2853 MultiVectorPtr_Type &f,
2854 MultiVectorPtr_Type u,
2855 ParameterListPtr_Type pList,
2857 bool callFillComplete){
2858 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::runtime_error,
"Not implemented for P0");
2859 UN FEloc = checkFE(dim,FEType);
2862 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
2863 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
2865 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
2866 vec3D_dbl_ptr_Type dPhi;
2867 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
2878 Teuchos::BLAS<int,SC> teuchosBLAS;
2880 int nmbQuadPoints = dPhi->size();
2881 int nmbScalarDPhi = dPhi->at(0).size();
2882 int nmbAllDPhi = nmbScalarDPhi * dim;
2883 int nmbAllDPhiAllQaud = nmbQuadPoints * nmbAllDPhi;
2884 int sizeLocStiff = dim*dim;
2885 Teuchos::Array<SmallMatrix<SC> > dPhiMat( nmbAllDPhiAllQaud,
SmallMatrix<SC>(dim) );
2887 this->buildFullDPhi( dPhi, dPhiMat );
2889 std::string material_model = pList->sublist(
"Parameter").get(
"Material model",
"Neo-Hooke");
2891 double poissonRatio = pList->sublist(
"Parameter").get(
"Poisson Ratio",0.4);
2892 double mue = pList->sublist(
"Parameter").get(
"Mu",2.0e+6);
2893 double mue1 = pList->sublist(
"Parameter").get(
"Mu1",2.0e+6);
2894 double mue2 = pList->sublist(
"Parameter").get(
"Mu2",2.0e+6);
2896 double E = pList->sublist(
"Parameter").get(
"E",3.0e+6);
2897 double E1 = pList->sublist(
"Parameter").get(
"E1",3.0e+6);
2898 double E2 = pList->sublist(
"Parameter").get(
"E2",3.0e+6);
2900 if (material_model==
"Saint Venant-Kirchhoff") {
2901 E = mue*2.*(1. + poissonRatio);
2902 E1 = mue1*2.*(1. + poissonRatio);
2903 E2 = mue2*2.*(1. + poissonRatio);
2907 double lambda = (poissonRatio*E)/((1 + poissonRatio)*(1 - 2*poissonRatio));
2908 double lambda1 = (poissonRatio*E1)/((1 + poissonRatio)*(1 - 2*poissonRatio));
2909 double lambda2 = (poissonRatio*E2)/((1 + poissonRatio)*(1 - 2*poissonRatio));
2913 if(!material_model.compare(
"Saint Venant-Kirchhoff"))
2914 v =
new double[154];
2916 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Only Saint Venant-Kirchhoff in 2D.");
2918 double** Pmat =
new double*[2];
2919 for (
int i=0; i<2; i++)
2920 Pmat[i] =
new double[2];
2922 double** F =
new double*[2];
2923 for (
int i=0; i<2; i++)
2924 F[i] =
new double[2];
2926 double**** Amat =
new double***[2];
2927 for (
int i=0; i<2; i++){
2928 Amat[i] =
new double**[2];
2929 for (
int j=0; j<2; j++) {
2930 Amat[i][j] =
new double*[2];
2931 for (
int k=0; k<2; k++)
2932 Amat[i][j][k] =
new double[2];
2936 Teuchos::ArrayRCP< const SC > uArray = u->getData(0);
2938 Teuchos::ArrayRCP<SC> fValues = f->getDataNonConst(0);
2940 Teuchos::Array<int> indices(2);
2941 for (
int T=0; T<elements->numberElements(); T++) {
2943 Helper::buildTransformation(elements->getElement(T).getVectorNodeList(), pointsRep, B,FEType);
2944 detB = B.computeInverse(Binv);
2945 absDetB = std::fabs(detB);
2947 Teuchos::Array<SmallMatrix<SC> > all_dPhiMat_Binv( dPhiMat.size(), SmallMatrix<SC>() );
2949 for (
int i=0; i<all_dPhiMat_Binv.size(); i++) {
2950 SmallMatrix<SC> res = dPhiMat[i] * Binv;
2951 all_dPhiMat_Binv[i] = res;
2954 SmallMatrix<SC> locStiffMat( nmbAllDPhi, 0. );
2955 std::vector<SC> locStresses( nmbAllDPhi, 0. );
2956 int elementFlag = 0;
2957 for (
int p=0; p<nmbQuadPoints; p++){
2959 SmallMatrix<SC> Fmat( dim, 0. );
2960 SmallMatrix<SC> tmpForScaling( dim, 0. );
2961 Fmat[0][0] = 1.; Fmat[1][1] = 1.;
2963 for (
int i=0; i<nmbScalarDPhi; i++) {
2964 indices.at(0) = dim * elements->getElement(T).getNode(i);
2965 indices.at(1) = dim * elements->getElement(T).getNode(i) + 1;
2967 for (
int j=0; j<dim; j++) {
2968 tmpForScaling = all_dPhiMat_Binv[ p * nmbAllDPhi + dim * i + j ];
2969 SC v = uArray[indices.at(j)];
2970 tmpForScaling.scale( v );
2971 Fmat += tmpForScaling;
2975 for (
int i=0; i<Fmat.size(); i++) {
2976 for (
int j=0; j<Fmat.size(); j++) {
2977 F[i][j] = Fmat[i][j];
2981 elementFlag = elements->getElement(T).getFlag();
2982 if (elementFlag == 1){
2987 else if (elementFlag == 2){
2993 if ( !material_model.compare(
"Saint Venant-Kirchhoff") )
2994 stvk2d(v, &lambda, &mue, F, Pmat, Amat);
2996 SmallMatrix<SC> Aloc(dim*dim);
2997 for (
int i=0; i<2; i++) {
2998 for (
int j=0; j<2; j++) {
2999 for (
int k=0; k<2; k++) {
3000 for (
int l=0; l<2; l++) {
3001 Aloc[ 2 * i + j ][ 2 * k + l ] = Amat[i][j][k][l];
3007 double* aceFEMFunc =
new double[ sizeLocStiff * sizeLocStiff ];
3008 double* allDPhiBlas =
new double[ nmbAllDPhi * sizeLocStiff ];
3011 double* resTmp =
new double[ nmbAllDPhi * sizeLocStiff ];
3013 fillMatrixArray(Aloc, aceFEMFunc,
"cols");
3015 int offset = p * nmbAllDPhi;
3016 int offsetInArray = 0;
3017 for (
int i=0; i<nmbAllDPhi; i++) {
3018 fillMatrixArray( all_dPhiMat_Binv[ offset + i ], allDPhiBlas,
"rows",offsetInArray );
3019 offsetInArray += sizeLocStiff;
3022 teuchosBLAS.GEMM (Teuchos::NO_TRANS, Teuchos::NO_TRANS, sizeLocStiff, nmbAllDPhi, sizeLocStiff, 1., aceFEMFunc, sizeLocStiff, allDPhiBlas, sizeLocStiff, 0., resTmp, sizeLocStiff);
3025 double* locStiffMatBlas =
new double[ nmbAllDPhi * nmbAllDPhi ];
3027 teuchosBLAS.GEMM (Teuchos::TRANS, Teuchos::NO_TRANS, nmbAllDPhi, nmbAllDPhi, sizeLocStiff, 1., allDPhiBlas, sizeLocStiff, resTmp, sizeLocStiff, 0., locStiffMatBlas, nmbAllDPhi);
3029 for (
int i=0; i<nmbAllDPhi; i++) {
3030 for (
int j=0; j<nmbAllDPhi; j++)
3031 locStiffMat[i][j] += weights->at(p) * locStiffMatBlas[ j * nmbAllDPhi + i ];
3035 delete [] locStiffMatBlas;
3039 double* fArray =
new double[ sizeLocStiff ];
3040 for (
int i=0; i<dim; i++) {
3041 for (
int j=0; j<dim; j++) {
3042 fArray[i * dim + j] = Pmat[i][j];
3046 double* res =
new double[ nmbAllDPhi ];
3047 teuchosBLAS.GEMV(Teuchos::TRANS, sizeLocStiff, nmbAllDPhi, 1., allDPhiBlas, sizeLocStiff, fArray, 1, 0., res, 1);
3048 for (
int i=0; i<locStresses.size(); i++) {
3049 locStresses[i] += weights->at(p) * res[i];
3053 delete [] aceFEMFunc;
3054 delete [] allDPhiBlas;
3058 for (
int i=0; i<nmbScalarDPhi; i++) {
3059 for (
int d1=0; d1<dim; d1++) {
3061 LO rowLO = dim * elements->getElement(T).getNode(i) + d1;
3062 SC v = absDetB * locStresses[ dim * i + d1 ];
3063 fValues[rowLO] += v;
3065 Teuchos::Array<SC> value( nmbAllDPhi, 0. );
3066 Teuchos::Array<GO> indices( nmbAllDPhi, 0 );
3068 for (UN j=0; j < nmbScalarDPhi; j++){
3069 for (UN d2=0; d2<dim; d2++) {
3070 indices[counter] = GO ( dim * map->getGlobalElement( elements->getElement(T).getNode(j) ) + d2 );
3071 value[counter] = absDetB * locStiffMat[dim*i+d1][dim*j+d2];
3075 GO row = GO ( dim * map->getGlobalElement( elements->getElement(T).getNode(i) ) + d1 );
3076 A->insertGlobalValues( row, indices(), value() );
3082 for (
int i=0; i<2; i++)
3085 for (
int i=0; i<2; i++)
3089 for (
int i=0; i<2; i++){
3090 for (
int j=0; j<2; j++) {
3091 for (
int k=0; k<2; k++)
3092 delete [] Amat[i][j][k];
3093 delete [] Amat[i][j];
3101 else if (dim == 3) {
3103 if (!material_model.compare(
"Neo-Hooke"))
3104 v =
new double[466];
3105 else if(!material_model.compare(
"Mooney-Rivlin"))
3106 v =
new double[476];
3107 else if(!material_model.compare(
"Saint Venant-Kirchhoff"))
3108 v =
new double[279];
3110 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Only Neo-Hooke, Mooney-Rivlin and Saint Venant-Kirchhoff.");
3113 double** Pmat =
new double*[3];
3114 for (
int i=0; i<3; i++)
3115 Pmat[i] =
new double[3];
3117 double** F =
new double*[3];
3118 for (
int i=0; i<3; i++)
3119 F[i] =
new double[3];
3121 double**** Amat =
new double***[3];
3122 for (
int i=0; i<3; i++){
3123 Amat[i] =
new double**[3];
3124 for (
int j=0; j<3; j++) {
3125 Amat[i][j] =
new double*[3];
3126 for (
int k=0; k<3; k++)
3127 Amat[i][j][k] =
new double[3];
3131 Teuchos::ArrayRCP< const SC > uArray = u->getData(0);
3133 Teuchos::ArrayRCP<SC> fValues = f->getDataNonConst(0);
3135 Teuchos::Array<int> indices(3);
3136 for (
int T=0; T<elements->numberElements(); T++) {
3138 Helper::buildTransformation(elements->getElement(T).getVectorNodeList(), pointsRep, B,FEType);
3139 detB = B.computeInverse(Binv);
3140 absDetB = std::fabs(detB);
3142 Teuchos::Array<SmallMatrix<SC> > all_dPhiMat_Binv( dPhiMat.size(), SmallMatrix<SC>() );
3144 for (
int i=0; i<all_dPhiMat_Binv.size(); i++) {
3145 SmallMatrix<SC> res = dPhiMat[i] * Binv;
3146 all_dPhiMat_Binv[i] = res;
3149 SmallMatrix<SC> locStiffMat( nmbAllDPhi, 0. );
3150 std::vector<SC> locStresses( nmbAllDPhi, 0. );
3151 int elementFlag = 0;
3152 for (
int p=0; p<nmbQuadPoints; p++){
3154 SmallMatrix<SC> Fmat( dim, 0. );
3155 SmallMatrix<SC> tmpForScaling( dim, 0. );
3156 Fmat[0][0] = 1.; Fmat[1][1] = 1.; Fmat[2][2] = 1.;
3158 for (
int i=0; i<nmbScalarDPhi; i++) {
3159 indices.at(0) = dim * elements->getElement(T).getNode(i);
3160 indices.at(1) = dim * elements->getElement(T).getNode(i) + 1;
3161 indices.at(2) = dim * elements->getElement(T).getNode(i) + 2;
3163 for (
int j=0; j<dim; j++) {
3164 tmpForScaling = all_dPhiMat_Binv[ p * nmbAllDPhi + dim * i + j ];
3165 SC v = uArray[indices.at(j)];
3166 tmpForScaling.scale( v );
3167 Fmat += tmpForScaling;
3171 for (
int i=0; i<Fmat.size(); i++) {
3172 for (
int j=0; j<Fmat.size(); j++) {
3173 F[i][j] = Fmat[i][j];
3177 elementFlag = elements->getElement(T).getFlag();
3178 if (elementFlag == 1){
3183 else if (elementFlag == 2){
3189 if ( !material_model.compare(
"Neo-Hooke") )
3190 nh3d(v, &E, &poissonRatio, F, Pmat, Amat);
3191 else if ( !material_model.compare(
"Mooney-Rivlin") )
3192 mr3d(v, &E, &poissonRatio, &C, F, Pmat, Amat);
3193 else if ( !material_model.compare(
"Saint Venant-Kirchhoff") )
3194 stvk3d(v, &lambda, &mue, F, Pmat, Amat);
3196 SmallMatrix<SC> Aloc(dim*dim);
3197 for (
int i=0; i<3; i++) {
3198 for (
int j=0; j<3; j++) {
3199 for (
int k=0; k<3; k++) {
3200 for (
int l=0; l<3; l++) {
3201 Aloc[ 3 * i + j ][ 3 * k + l ] = Amat[i][j][k][l];
3207 double* aceFEMFunc =
new double[ sizeLocStiff * sizeLocStiff ];
3208 double* allDPhiBlas =
new double[ nmbAllDPhi * sizeLocStiff ];
3211 double* resTmp =
new double[ nmbAllDPhi * sizeLocStiff ];
3213 fillMatrixArray(Aloc, aceFEMFunc,
"cols");
3215 int offset = p * nmbAllDPhi;
3216 int offsetInArray = 0;
3217 for (
int i=0; i<nmbAllDPhi; i++) {
3218 fillMatrixArray( all_dPhiMat_Binv[ offset + i ], allDPhiBlas,
"rows",offsetInArray );
3219 offsetInArray += sizeLocStiff;
3222 teuchosBLAS.GEMM (Teuchos::NO_TRANS, Teuchos::NO_TRANS, sizeLocStiff, nmbAllDPhi, sizeLocStiff, 1., aceFEMFunc, sizeLocStiff, allDPhiBlas, sizeLocStiff, 0., resTmp, sizeLocStiff);
3225 double* locStiffMatBlas =
new double[ nmbAllDPhi * nmbAllDPhi ];
3227 teuchosBLAS.GEMM (Teuchos::TRANS, Teuchos::NO_TRANS, nmbAllDPhi, nmbAllDPhi, sizeLocStiff, 1., allDPhiBlas, sizeLocStiff, resTmp, sizeLocStiff, 0., locStiffMatBlas, nmbAllDPhi);
3229 for (
int i=0; i<nmbAllDPhi; i++) {
3230 for (
int j=0; j<nmbAllDPhi; j++)
3231 locStiffMat[i][j] += weights->at(p) * locStiffMatBlas[ j * nmbAllDPhi + i ];
3235 delete [] locStiffMatBlas;
3239 double* fArray =
new double[ sizeLocStiff ];
3240 for (
int i=0; i<dim; i++) {
3241 for (
int j=0; j<dim; j++) {
3242 fArray[i * dim + j] = Pmat[i][j];
3246 double* res =
new double[ nmbAllDPhi ];
3247 teuchosBLAS.GEMV(Teuchos::TRANS, sizeLocStiff, nmbAllDPhi, 1., allDPhiBlas, sizeLocStiff, fArray, 1, 0., res, 1);
3248 for (
int i=0; i<locStresses.size(); i++) {
3249 locStresses[i] += weights->at(p) * res[i];
3253 delete [] aceFEMFunc;
3254 delete [] allDPhiBlas;
3258 for (
int i=0; i<nmbScalarDPhi; i++) {
3259 for (
int d1=0; d1<dim; d1++) {
3261 LO rowLO = dim * elements->getElement(T).getNode(i) + d1;
3262 SC v = absDetB * locStresses[ dim * i + d1 ];
3263 fValues[rowLO] += v;
3265 Teuchos::Array<SC> value( nmbAllDPhi, 0. );
3266 Teuchos::Array<GO> indices( nmbAllDPhi, 0 );
3268 for (UN j=0; j < nmbScalarDPhi; j++){
3269 for (UN d2=0; d2<dim; d2++) {
3270 indices[counter] = GO ( dim * map->getGlobalElement( elements->getElement(T).getNode(j) ) + d2 );
3271 value[counter] = absDetB * locStiffMat[dim*i+d1][dim*j+d2];
3276 GO row = GO ( dim * map->getGlobalElement( elements->getElement(T).getNode(i) ) + d1 );
3277 A->insertGlobalValues( row, indices(), value() );
3283 for (
int i=0; i<3; i++)
3286 for (
int i=0; i<3; i++)
3290 for (
int i=0; i<3; i++){
3291 for (
int j=0; j<3; j++) {
3292 for (
int k=0; k<3; k++)
3293 delete [] Amat[i][j][k];
3294 delete [] Amat[i][j];
3301 if (callFillComplete)
3307template <
class SC,
class LO,
class GO,
class NO>
3308void FE<SC,LO,GO,NO>::assemblyElasticityJacobianAceFEM(
int dim,
3311 MultiVectorPtr_Type u,
3312 std::string material_model,
3316 bool callFillComplete){
3317 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
3318 UN FEloc = checkFE(dim,FEType);
3320 vec2D_int_ptr_Type elements = domainVec_.at(FEloc)->getElements();
3322 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
3324 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
3325 vec3D_dbl_ptr_Type dPhi;
3326 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
3328 UN deg = 2*Helper::determineDegree(dim,FEType,Helper::Deriv1);
3330 Helper::getDPhi(dPhi, weights, dim, FEType, deg);
3334 SmallMatrix<SC> B(dim);
3335 SmallMatrix<SC> Binv(dim);
3337 Teuchos::BLAS<int, SC> teuchosBLAS;
3339 int nmbQuadPoints = dPhi->size();
3340 int nmbScalarDPhi = dPhi->at(0).size();
3341 int nmbAllDPhi = nmbScalarDPhi * dim;
3342 int nmbAllDPhiAllQaud = nmbQuadPoints * nmbAllDPhi;
3343 int sizeLocStiff = dim*dim;
3344 Teuchos::Array<SmallMatrix<SC> > dPhiMat( nmbAllDPhiAllQaud, SmallMatrix<SC>(dim) );
3346 this->buildFullDPhi( dPhi, dPhiMat );
3349 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Only for 3D.");
3351 else if (dim == 3) {
3354 if (!material_model.compare(
"Neo-Hooke"))
3355 v =
new double[466];
3356 else if(!material_model.compare(
"Mooney-Rivlin"))
3357 v =
new double[476];
3359 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Only Neo-Hooke and Mooney-Rivlin.");
3363 double** Pmat =
new double*[3];
3364 for (
int i=0; i<3; i++)
3365 Pmat[i] =
new double[3];
3367 double** F =
new double*[3];
3368 for (
int i=0; i<3; i++)
3369 F[i] =
new double[3];
3371 double**** Amat =
new double***[3];
3372 for (
int i=0; i<3; i++){
3373 Amat[i] =
new double**[3];
3374 for (
int j=0; j<3; j++) {
3375 Amat[i][j] =
new double*[3];
3376 for (
int k=0; k<3; k++)
3377 Amat[i][j][k] =
new double[3];
3381 Teuchos::ArrayRCP< const SC > uArray = u->getData(0);
3383 Teuchos::Array<int> indices(3);
3384 for (
int T=0; T<elements->size(); T++) {
3386 Helper::buildTransformation(elements->at(T), pointsRep, B,FEType);
3387 detB = B.computeInverse(Binv);
3388 absDetB = std::fabs(detB);
3390 Teuchos::Array<SmallMatrix<SC> > all_dPhiMat_Binv( dPhiMat.size(), SmallMatrix<SC>() );
3392 for (
int i=0; i<all_dPhiMat_Binv.size(); i++) {
3393 SmallMatrix<SC> res = dPhiMat[i] * Binv;
3394 all_dPhiMat_Binv[i] = res;
3397 SmallMatrix<SC> locStiffMat( nmbAllDPhi, 0. );
3399 for (
int p=0; p<nmbQuadPoints; p++){
3401 SmallMatrix<SC> Fmat( dim, 0. );
3402 SmallMatrix<SC> tmpForScaling( dim, 0. );
3403 Fmat[0][0] = 1.; Fmat[1][1] = 1.; Fmat[2][2] = 1.;
3405 for (
int i=0; i<nmbScalarDPhi; i++) {
3406 indices.at(0) = dim * elements->at(T).at(i);
3407 indices.at(1) = dim * elements->at(T).at(i) + 1;
3408 indices.at(2) = dim * elements->at(T).at(i) + 2;
3410 for (
int j=0; j<dim; j++) {
3411 tmpForScaling = all_dPhiMat_Binv[ p * nmbAllDPhi + dim * i + j ];
3412 SC v = uArray[indices.at(j)];
3413 tmpForScaling.scale( v );
3414 Fmat += tmpForScaling;
3418 for (
int i=0; i<Fmat.size(); i++) {
3419 for (
int j=0; j<Fmat.size(); j++) {
3420 F[i][j] = Fmat[i][j];
3423 if ( !material_model.compare(
"Neo-Hooke") )
3424 nh3d(v, &E, &nu, F, Pmat, Amat);
3425 else if ( !material_model.compare(
"Mooney-Rivlin") )
3426 mr3d(v, &E, &nu, &C, F, Pmat, Amat);
3428 SmallMatrix<SC> Aloc(dim*dim);
3429 for (
int i=0; i<3; i++) {
3430 for (
int j=0; j<3; j++) {
3431 for (
int k=0; k<3; k++) {
3432 for (
int l=0; l<3; l++) {
3433 Aloc[ 3 * i + j ][ 3 * k + l ] = Amat[i][j][k][l];
3439 double* aceFEMFunc =
new double[ sizeLocStiff * sizeLocStiff ];
3440 double* allDPhiBlas =
new double[ nmbAllDPhi * sizeLocStiff ];
3441 double* resTmp =
new double[ nmbAllDPhi * sizeLocStiff ];
3443 fillMatrixArray(Aloc, aceFEMFunc,
"cols");
3445 int offset = p * nmbAllDPhi;
3446 int offsetInArray = 0;
3447 for (
int i=0; i<nmbAllDPhi; i++) {
3448 fillMatrixArray( all_dPhiMat_Binv[ offset + i ], allDPhiBlas,
"rows",offsetInArray );
3449 offsetInArray += sizeLocStiff;
3452 teuchosBLAS.GEMM (Teuchos::NO_TRANS, Teuchos::NO_TRANS, sizeLocStiff, nmbAllDPhi, sizeLocStiff, 1., aceFEMFunc, sizeLocStiff, allDPhiBlas, sizeLocStiff, 0., resTmp, sizeLocStiff);
3454 double* locStiffMatBlas =
new double[ nmbAllDPhi * nmbAllDPhi ];
3456 teuchosBLAS.GEMM (Teuchos::TRANS, Teuchos::NO_TRANS, nmbAllDPhi, nmbAllDPhi, sizeLocStiff, 1., allDPhiBlas, sizeLocStiff, resTmp, sizeLocStiff, 0., locStiffMatBlas, nmbAllDPhi);
3458 for (
int i=0; i<nmbAllDPhi; i++) {
3459 for (
int j=0; j<nmbAllDPhi; j++)
3460 locStiffMat[i][j] += weights->at(p) * locStiffMatBlas[ j * nmbAllDPhi + i ];
3463 delete [] aceFEMFunc;
3464 delete [] allDPhiBlas;
3466 delete [] locStiffMatBlas;
3469 for (
int i=0; i<nmbScalarDPhi; i++) {
3470 for (
int d1=0; d1<dim; d1++) {
3471 Teuchos::Array<SC> value( nmbAllDPhi, 0. );
3472 Teuchos::Array<GO> indices( nmbAllDPhi, 0 );
3474 for (UN j=0; j < nmbScalarDPhi; j++){
3475 for (UN d2=0; d2<dim; d2++) {
3476 indices[counter] = GO ( dim * map->getGlobalElement( elements->at(T).at(j) ) + d2 );
3477 value[counter] = absDetB * locStiffMat[dim*i+d1][dim*j+d2];
3481 GO row = GO ( dim * map->getGlobalElement( elements->at(T).at(i) ) + d1 );
3482 A->insertGlobalValues( row, indices(), value() );
3488 for (
int i=0; i<3; i++)
3491 for (
int i=0; i<3; i++)
3495 for (
int i=0; i<3; i++){
3496 for (
int j=0; j<3; j++) {
3497 for (
int k=0; k<3; k++)
3498 delete [] Amat[i][j][k];
3499 delete [] Amat[i][j];
3506 if (callFillComplete)
3511template <
class SC,
class LO,
class GO,
class NO>
3512void FE<SC,LO,GO,NO>::assemblyElasticityStressesAceFEM(
int dim,
3514 MultiVectorPtr_Type &f,
3515 MultiVectorPtr_Type u,
3516 std::string material_model,
3520 bool callFillComplete){
3521 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
3522 UN FEloc = checkFE(dim,FEType);
3524 vec2D_int_ptr_Type elements = domainVec_.at(FEloc)->getElements();
3526 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
3528 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
3530 vec3D_dbl_ptr_Type dPhi;
3531 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
3533 UN deg = 2*Helper::determineDegree(dim,FEType,Helper::Deriv1);
3535 Helper::getDPhi(dPhi, weights, dim, FEType, deg);
3539 SmallMatrix<SC> B(dim);
3540 SmallMatrix<SC> Binv(dim);
3542 Teuchos::BLAS<int, SC> teuchosBLAS;
3544 int nmbQuadPoints = dPhi->size();
3545 int nmbScalarDPhi = dPhi->at(0).size();
3546 int nmbAllDPhi = nmbScalarDPhi * dim;
3547 int nmbAllDPhiAllQaud = nmbQuadPoints * nmbAllDPhi;
3548 int sizeLocStiff = dim*dim;
3549 Teuchos::Array<SmallMatrix<SC> > dPhiMat( nmbAllDPhiAllQaud, SmallMatrix<SC>(dim) );
3551 this->buildFullDPhi( dPhi, dPhiMat );
3554 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Only for 3D.");
3556 else if (dim == 3) {
3559 if (!material_model.compare(
"Neo-Hooke"))
3560 v =
new double[466];
3561 else if(!material_model.compare(
"Mooney-Rivlin"))
3562 v =
new double[476];
3564 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Only Neo-Hooke and Mooney-Rivlin.");
3568 double** Pmat =
new double*[3];
3569 for (
int i=0; i<3; i++)
3570 Pmat[i] =
new double[3];
3572 double** F =
new double*[3];
3573 for (
int i=0; i<3; i++)
3574 F[i] =
new double[3];
3576 double**** Amat =
new double***[3];
3577 for (
int i=0; i<3; i++){
3578 Amat[i] =
new double**[3];
3579 for (
int j=0; j<3; j++) {
3580 Amat[i][j] =
new double*[3];
3581 for (
int k=0; k<3; k++)
3582 Amat[i][j][k] =
new double[3];
3586 Teuchos::ArrayRCP< const SC > uArray = u->getData(0);
3588 Teuchos::ArrayRCP<SC> fValues = f->getDataNonConst(0);
3590 Teuchos::Array<int> indices(3);
3591 for (
int T=0; T<elements->size(); T++) {
3593 Helper::buildTransformation(elements->at(T), pointsRep, B,FEType);
3594 detB = B.computeInverse(Binv);
3595 absDetB = std::fabs(detB);
3597 Teuchos::Array<SmallMatrix<SC> > all_dPhiMat_Binv( dPhiMat.size(), SmallMatrix<SC>() );
3599 for (
int i=0; i<all_dPhiMat_Binv.size(); i++) {
3600 SmallMatrix<SC> res = dPhiMat[i] * Binv;
3601 all_dPhiMat_Binv[i] = res;
3603 std::vector<double> locStresses( nmbAllDPhi, 0. );
3605 for (
int p=0; p<nmbQuadPoints; p++){
3607 SmallMatrix<SC> Fmat( dim, 0. );
3608 SmallMatrix<SC> tmpForScaling( dim, 0. );
3609 Fmat[0][0] = 1.; Fmat[1][1] = 1.; Fmat[2][2] = 1.;
3611 for (
int i=0; i<nmbScalarDPhi; i++) {
3612 indices.at(0) = dim * elements->at(T).at(i);
3613 indices.at(1) = dim * elements->at(T).at(i) + 1;
3614 indices.at(2) = dim * elements->at(T).at(i) + 2;
3616 for (
int j=0; j<dim; j++) {
3617 tmpForScaling = all_dPhiMat_Binv[ p * nmbAllDPhi + dim * i + j ];
3618 SC v = uArray[indices.at(j)];
3619 tmpForScaling.scale( v );
3620 Fmat += tmpForScaling;
3624 for (
int i=0; i<Fmat.size(); i++) {
3625 for (
int j=0; j<Fmat.size(); j++) {
3626 F[i][j] = Fmat[i][j];
3629 if ( !material_model.compare(
"Neo-Hooke") )
3630 nh3d(v, &E, &nu, F, Pmat, Amat);
3631 else if ( !material_model.compare(
"Mooney-Rivlin") )
3632 mr3d(v, &E, &nu, &C, F, Pmat, Amat);
3634 double* aceFEMFunc =
new double[ sizeLocStiff * sizeLocStiff ];
3635 double* allDPhiBlas =
new double[ nmbAllDPhi * sizeLocStiff ];
3637 int offset = p * nmbAllDPhi;
3638 int offsetInArray = 0;
3639 for (
int i=0; i<nmbAllDPhi; i++) {
3640 fillMatrixArray( all_dPhiMat_Binv[ offset + i ], allDPhiBlas,
"rows",offsetInArray );
3641 offsetInArray += sizeLocStiff;
3645 double* fArray =
new double[ sizeLocStiff ];
3646 for (
int i=0; i<dim; i++) {
3647 for (
int j=0; j<dim; j++) {
3648 fArray[i * dim + j] = Pmat[i][j];
3652 double* res =
new double[ nmbAllDPhi ];
3653 teuchosBLAS.GEMV(Teuchos::TRANS, sizeLocStiff, nmbAllDPhi, 1., allDPhiBlas, sizeLocStiff, fArray, 1, 0., res, 1);
3654 for (
int i=0; i<locStresses.size(); i++) {
3655 locStresses[i] += weights->at(p) * res[i];
3658 delete [] aceFEMFunc;
3659 delete [] allDPhiBlas;
3665 for (
int i=0; i<nmbScalarDPhi; i++) {
3666 for (
int d1=0; d1<dim; d1++) {
3667 LO row = dim * elements->at(T).at(i) + d1;
3668 SC v = absDetB * locStresses[ dim * i + d1 ];
3676 for (
int i=0; i<3; i++)
3679 for (
int i=0; i<3; i++)
3683 for (
int i=0; i<3; i++){
3684 for (
int j=0; j<3; j++) {
3685 for (
int k=0; k<3; k++)
3686 delete [] Amat[i][j][k];
3687 delete [] Amat[i][j];
3697template <
class SC,
class LO,
class GO,
class NO>
3701 MultiVectorPtr_Type u,
3702 bool callFillComplete){
3704 TEUCHOS_TEST_FOR_EXCEPTION( u->getNumVectors()>1, std::logic_error,
"Implement for numberMV > 1 ." );
3705 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
3707 UN FEloc = checkFE(dim,FEType);
3709 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
3711 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
3713 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
3715 vec3D_dbl_ptr_Type dPhi;
3716 vec2D_dbl_ptr_Type phi;
3717 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
3732 vec_dbl_Type v_i(dim);
3733 vec_dbl_Type v_j(dim);
3735 vec2D_dbl_Type uLoc( dim, vec_dbl_Type( weights->size() , -1. ) );
3736 Teuchos::ArrayRCP< const SC > uArray = u->getData(0);
3738 for (UN T=0; T<elements->numberElements(); T++) {
3741 detB = B.computeInverse(Binv);
3742 absDetB = std::fabs(detB);
3744 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
3745 applyBTinv( dPhi, dPhiTrans, Binv );
3747 for (
int w=0; w<phi->size(); w++){
3748 for (
int d=0; d<dim; d++) {
3750 for (
int i=0; i < phi->at(0).size(); i++) {
3751 LO index = dim * elements->getElement(T).getNode(i) + d;
3752 uLoc[d][w] += uArray[index] * phi->at(w).at(i);
3757 for (UN i=0; i < phi->at(0).size(); i++) {
3758 Teuchos::Array<SC> value( dPhiTrans[0].size(), 0. );
3759 Teuchos::Array<GO> indices( dPhiTrans[0].size(), 0 );
3760 for (UN j=0; j < value.size(); j++) {
3761 for (UN w=0; w<dPhiTrans.size(); w++) {
3762 for (UN d=0; d<dim; d++){
3763 value[j] += weights->at(w) * uLoc[d][w] * (*phi)[w][i] * dPhiTrans[w][j][d];
3767 value[j] *= absDetB;
3768 if (setZeros_ && std::fabs(value[j]) < myeps_) {
3772 GO row = GO ( dim * map->getGlobalElement( elements->getElement(T).getNode(i) ) );
3773 GO glob_j = GO ( dim * map->getGlobalElement( elements->getElement(T).getNode(j) ) );
3775 for (UN d=0; d<dim; d++) {
3776 for (UN j=0; j < indices.size(); j++)
3777 indices[j] = GO ( dim * map->getGlobalElement( elements->getElement(T).getNode(j) ) + d );
3779 GO row = GO ( dim * map->getGlobalElement( elements->getElement(T).getNode(i) ) + d );
3780 A->insertGlobalValues( row, indices(), value() );
3786 if (callFillComplete)
3791template <
class SC,
class LO,
class GO,
class NO>
3795 MultiVectorPtr_Type u,
3796 bool callFillComplete){
3798 TEUCHOS_TEST_FOR_EXCEPTION( u->getNumVectors()>1, std::logic_error,
"Implement for numberMV > 1 ." );
3799 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
3800 UN FEloc = checkFE(dim,FEType);
3802 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
3804 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
3806 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
3808 vec3D_dbl_ptr_Type dPhi;
3809 vec2D_dbl_ptr_Type phi;
3810 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
3824 vec_dbl_Type v_i(dim);
3825 vec_dbl_Type v_j(dim);
3827 Teuchos::ArrayRCP< const SC > uArray = u->getData(0);
3829 for (UN T=0; T<elements->numberElements(); T++) {
3832 detB = B.computeInverse(Binv);
3833 absDetB = std::fabs(detB);
3835 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
3836 applyBTinv( dPhi, dPhiTrans, Binv );
3838 std::vector<SmallMatrix<SC> > duLoc( weights->size(),
SmallMatrix<SC>(dim) );
3840 for (
int w=0; w<dPhiTrans.size(); w++){
3841 for (
int d1=0; d1<dim; d1++) {
3842 for (
int i=0; i < dPhiTrans[0].size(); i++) {
3843 LO index = dim * elements->getElement(T).getNode(i) + d1;
3844 for (
int d2=0; d2<dim; d2++)
3845 duLoc[w][d2][d1] += uArray[index] * dPhiTrans[w][i][d2];
3850 for (UN i=0; i < phi->at(0).size(); i++) {
3851 for (UN d1=0; d1<dim; d1++) {
3852 Teuchos::Array<SC> value( dim*phi->at(0).size(), 0. );
3853 Teuchos::Array<GO> indices( dim*phi->at(0).size(), 0 );
3854 for (UN j=0; j < phi->at(0).size(); j++) {
3855 for (UN d2=0; d2<dim; d2++){
3856 for (UN w=0; w<phi->size(); w++) {
3857 value[ dim * j + d2 ] += weights->at(w) * duLoc[w][d2][d1] * (*phi)[w][i] * (*phi)[w][j];
3859 value[ dim * j + d2 ] *= absDetB;
3861 if (setZeros_ && std::fabs(value[ dim * j + d2 ]) < myeps_) {
3862 value[ dim * j + d2 ] = 0.;
3866 for (UN j=0; j < phi->at(0).size(); j++){
3867 for (UN d2=0; d2<dim; d2++){
3868 indices[ dim * j + d2 ] = GO ( dim * map->getGlobalElement( elements->getElement(T).getNode(j) ) + d2 );
3872 GO row = GO ( dim * map->getGlobalElement( elements->getElement(T).getNode(i) ) + d1 );
3873 A->insertGlobalValues( row, indices(), value() );
3877 if (callFillComplete)
3882template <
class SC,
class LO,
class GO,
class NO>
3885 std::string FETypeV,
3887 MultiVectorPtr_Type u,
3888 bool callFillComplete){
3890 TEUCHOS_TEST_FOR_EXCEPTION( u->getNumVectors()>1, std::logic_error,
"Implement for numberMV > 1 ." );
3891 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
3893 UN FEloc = checkFE(dim,FEType);
3895 ElementsPtr_Type elements = domainVec_.at(1)->getElementsC();
3896 ElementsPtr_Type elementsVel = domainVec_.at(0)->getElementsC();
3898 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(1)->getPointsRepeated();
3900 MapConstPtr_Type map = domainVec_.at(1)->getMapRepeated();
3902 vec3D_dbl_ptr_Type dPhi;
3903 vec2D_dbl_ptr_Type phi,phiV;
3904 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
3919 vec_dbl_Type v_i(dim);
3920 vec_dbl_Type v_j(dim);
3922 vec2D_dbl_Type uLoc( dim, vec_dbl_Type( weights->size() , -1. ) );
3923 Teuchos::ArrayRCP< const SC > uArray = u->getData(0);
3925 for (UN T=0; T<elements->numberElements(); T++) {
3928 detB = B.computeInverse(Binv);
3929 absDetB = std::fabs(detB);
3931 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
3932 applyBTinv( dPhi, dPhiTrans, Binv );
3934 for (
int w=0; w<phiV->size(); w++){
3935 for (
int d=0; d<dim; d++) {
3937 for (
int i=0; i < phiV->at(0).size(); i++) {
3938 LO index = dim * elementsVel->getElement(T).getNode(i) + d;
3939 uLoc[d][w] += uArray[index] * phiV->at(w).at(i);
3944 for (UN i=0; i < phi->at(0).size(); i++) {
3945 Teuchos::Array<SC> value( dPhiTrans[0].size(), 0. );
3946 Teuchos::Array<GO> indices( dPhiTrans[0].size(), 0 );
3947 for (UN j=0; j < value.size(); j++) {
3948 for (UN w=0; w<dPhiTrans.size(); w++) {
3949 for (UN d=0; d<dim; d++){
3950 value[j] += weights->at(w) * uLoc[d][w]* dPhiTrans[w][j][d] * (*phi)[w][i] ;
3953 value[j] *= absDetB;
3954 indices[j] = GO ( map->getGlobalElement( elements->getElement(T).getNode(j) ) );
3957 GO row = GO ( map->getGlobalElement( elements->getElement(T).getNode(i) ) );
3958 A->insertGlobalValues( row, indices(), value() );
3964 if (callFillComplete)
3969template <
class SC,
class LO,
class GO,
class NO>
3971 std::string FEType1,
3972 std::string FEType2,
3974 MatrixPtr_Type &Bmat,
3975 MatrixPtr_Type &BTmat,
3976 MapConstPtr_Type map1,
3977 MapConstPtr_Type map2,
3978 bool callFillComplete) {
3981 UN FEloc1 = checkFE(dim,FEType1);
3982 UN FEloc2 = checkFE(dim,FEType2);
3984 ElementsPtr_Type elements1 = domainVec_.at(FEloc1)->getElementsC();
3985 ElementsPtr_Type elements2 = domainVec_.at(FEloc2)->getElementsC();
3987 vec2D_dbl_ptr_Type pointsRep1 = domainVec_.at(FEloc1)->getPointsRepeated();
3989 MapConstPtr_Type mapping1 = domainVec_.at(FEloc1)->getMapRepeated();
3990 MapConstPtr_Type mapping2;
3992 if (FEType2 ==
"P0")
3993 mapping2 = domainVec_.at(FEloc2)->getElementMap();
3995 mapping2 = domainVec_.at(FEloc2)->getMapRepeated();
3997 vec3D_dbl_ptr_Type dPhi;
3998 vec2D_dbl_ptr_Type phi;
3999 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
4008 if (FEType2==
"P1-disc" && FEType1==
"Q2" )
4018 vec_dbl_Type v_i(dim);
4019 vec_dbl_Type v_j(dim);
4021 for (UN T=0; T<elements1->numberElements(); T++) {
4024 detB = B.computeInverse(Binv);
4025 absDetB = std::fabs(detB);
4027 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
4028 applyBTinv( dPhi, dPhiTrans, Binv );
4030 for (UN i=0; i < phi->at(0).size(); i++) {
4031 Teuchos::Array<Teuchos::Array<SC> >valueVec( dim, Teuchos::Array<SC>( dPhiTrans[0].size(), 0. ) );
4032 Teuchos::Array<GO> indices( dPhiTrans[0].size(), 0 );
4034 for (UN j=0; j < valueVec[0].size(); j++) {
4035 for (UN w=0; w<dPhiTrans.size(); w++) {
4036 for (UN d=0; d<dim; d++)
4037 valueVec[d][j] += weights->at(w) * phi->at(w)[i] * dPhiTrans[w][j][d];
4039 for (UN d=0; d<dim; d++){
4040 valueVec[d][j] *= absDetB;
4041 if (setZeros_ && std::fabs(valueVec[d][j]) < myeps_) {
4042 valueVec[d][j] = 0.;
4046 for (UN d=0; d<dim; d++) {
4047 for (UN j=0; j < indices.size(); j++)
4048 indices[j] = GO ( dim * mapping1->getGlobalElement( elements1->getElement(T).getNode(j) ) + d );
4052 row = GO ( mapping2->getGlobalElement( T ) );
4054 row = GO ( mapping2->getGlobalElement( elements2->getElement(T).getNode(i) ) );
4055 Bmat->insertGlobalValues( row, indices(), valueVec[d]() );
4060 for (UN i=0; i < dPhiTrans[0].size(); i++) {
4062 Teuchos::Array<Teuchos::Array<SC> >valueVec( dim, Teuchos::Array<SC>( phi->at(0).size(), 0. ) );
4063 Teuchos::Array<GO> indices( phi->at(0).size(), 0 );
4064 for (UN j=0; j < valueVec[0].size(); j++) {
4065 for (UN w=0; w<dPhiTrans.size(); w++) {
4066 for (UN d=0; d<dim; d++)
4067 valueVec[d][j] += weights->at(w) * phi->at(w)[j] * dPhiTrans[w][i][d];
4069 for (UN d=0; d<dim; d++){
4070 valueVec[d][j] *= absDetB;
4071 if (setZeros_ && std::fabs(valueVec[d][j]) < myeps_) {
4072 valueVec[d][j] = 0.;
4077 for (UN j=0; j < indices.size(); j++){
4079 indices[j] = GO ( mapping2->getGlobalElement( T ) );
4081 indices[j] = GO ( mapping2->getGlobalElement( elements2->getElement(T).getNode(j) ) );
4083 for (UN d=0; d<dim; d++) {
4084 GO row = GO ( dim * mapping1->getGlobalElement( elements1->getElement(T).getNode(i) ) + d );
4085 BTmat->insertGlobalValues( row, indices(), valueVec[d]() );
4091 if (callFillComplete) {
4092 Bmat->fillComplete( map1, map2 );
4093 BTmat->fillComplete( map2, map1 );
4099template <
class SC,
class LO,
class GO,
class NO>
4101 std::string FEType1,
4102 std::string FEType2,
4104 MatrixPtr_Type &Bmat,
4105 MatrixPtr_Type &BTmat,
4106 MapConstPtr_Type map1,
4107 MapConstPtr_Type map2,
4108 bool callFillComplete) {
4111 UN FEloc1 = checkFE(dim,FEType1);
4112 UN FEloc2 = checkFE(dim,FEType2);
4114 ElementsPtr_Type elements1 = domainVec_.at(FEloc1)->getElementsC();
4115 ElementsPtr_Type elements2 = domainVec_.at(FEloc2)->getElementsC();
4117 vec2D_dbl_ptr_Type pointsRep1 = domainVec_.at(FEloc1)->getPointsRepeated();
4119 MapConstPtr_Type mapping1 = domainVec_.at(FEloc1)->getMapRepeated();
4120 MapConstPtr_Type mapping2;
4122 if (FEType2 ==
"P0")
4123 mapping2 = domainVec_.at(FEloc2)->getElementMap();
4125 mapping2 = domainVec_.at(FEloc2)->getMapRepeated();
4127 vec3D_dbl_ptr_Type dPhi;
4128 vec2D_dbl_ptr_Type phi;
4129 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
4138 if (FEType2==
"P1-disc" && FEType1==
"Q2" )
4148 vec_dbl_Type v_i(dim);
4149 vec_dbl_Type v_j(dim);
4151 Teuchos::Array<GO> colIndex( 1, 0 );
4152 Teuchos::Array<GO> rowIndex( 1, 0 );
4153 Teuchos::Array<SC> value(1, 0.);
4155 for (UN T=0; T<elements1->numberElements(); T++) {
4158 detB = B.computeInverse(Binv);
4159 absDetB = std::fabs(detB);
4161 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
4162 applyBTinv( dPhi, dPhiTrans, Binv );
4164 for (UN i=0; i < phi->at(0).size(); i++) {
4166 rowIndex[0] = GO ( mapping2->getGlobalElement( T ) );
4168 rowIndex[0] = GO ( mapping2->getGlobalElement( elements2->getElement(T).getNode(i) ) );
4170 for (UN j=0; j < dPhiTrans[0].size(); j++) {
4171 for (UN d=0; d<dim; d++){
4173 for (UN w=0; w<dPhiTrans.size(); w++)
4174 value[0] += weights->at(w) * phi->at(w)[i] * dPhiTrans[w][j][d];
4175 value[0] *= absDetB;
4176 colIndex[0] = GO ( dim * mapping1->getGlobalElement( elements1->getElement(T).getNode(j) ) + d );
4177 Bmat->insertGlobalValues( rowIndex[0], colIndex(), value() );
4178 BTmat->insertGlobalValues( colIndex[0], rowIndex(), value() );
4185 if (callFillComplete) {
4186 Bmat->fillComplete( map1, map2 );
4187 BTmat->fillComplete( map2, map1 );
4193template <
class SC,
class LO,
class GO,
class NO>
4197 bool callFillComplete){
4199 TEUCHOS_TEST_FOR_EXCEPTION(FEType !=
"P1" && FEType !=
"Q1",std::logic_error,
"Only implemented for P1, Q1.");
4200 UN FEloc = checkFE(dim,FEType);
4202 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
4204 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
4206 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
4208 vec2D_dbl_ptr_Type phi;
4210 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
4220 vec_dbl_Type v_i(dim);
4221 vec_dbl_Type v_j(dim);
4227 refElementSize = 0.5;
4228 refElementScale = 1./9.;
4231 refElementSize = 1./6.;
4232 refElementScale = 1./16.;
4235 else if(FEType==
"Q1"){
4237 refElementScale=1./64;
4241 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Q1 Only implemented for 3D.");
4245 for (UN T=0; T<elements->numberElements(); T++) {
4248 detB = B.computeDet( );
4249 absDetB = std::fabs(detB);
4251 for (UN i=0; i < phi->at(0).size(); i++) {
4252 Teuchos::Array<SC> value( phi->at(0).size(), 0. );
4253 Teuchos::Array<GO> indices( phi->at(0).size(), 0 );
4254 for (UN j=0; j < value.size(); j++) {
4255 for (UN w=0; w<phi->size(); w++) {
4256 value[j] += weights->at(w) * (*phi)[w][i] * (*phi)[w][j];
4258 value[j] *= absDetB;
4259 value[j] -= refElementSize * absDetB * refElementScale;
4261 indices[j] = map->getGlobalElement( elements->getElement(T).getNode(j) );
4264 GO row = map->getGlobalElement( elements->getElement(T).getNode(i) );
4265 A->insertGlobalValues( row, indices(), value() );
4270 if (callFillComplete)
4276template <
class SC,
class LO,
class GO,
class NO>
4280 CoeffFuncDbl_Type func,
4282 bool callFillComplete)
4284 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
4285 int FEloc = this->checkFE(dim,FEType);
4287 DomainConstPtr_Type domain = domainVec_.at(FEloc);
4288 ElementsPtr_Type elements = domain->getElementsC();
4289 vec2D_dbl_ptr_Type pointsRep = domain->getPointsRepeated();
4290 MapConstPtr_Type map = domain->getMapRepeated();
4292 vec3D_dbl_ptr_Type dPhi;
4293 vec_dbl_ptr_Type weightsDPhi = Teuchos::rcp(
new vec_dbl_Type(0));
4294 vec2D_dbl_ptr_Type quadPts;
4311 vec_dbl_ptr_Type dist = domain->getDistancesToInterface();
4314 double val, value1_j, value2_j , value1_i, value2_i;
4315 vec_dbl_Type p1(3,0.0), p2(3,0.0), p3(3,0.0);
4317 double distance1, distance2, distance3;
4318 vec_dbl_Type distance_mean(1);
4319 for (
int T = 0; T < elements->numberElements(); T++)
4321 p1 = pointsRep->at(elements->getElement(T).getNode(0));
4322 p2 = pointsRep->at(elements->getElement(T).getNode(1));
4323 p3 = pointsRep->at(elements->getElement(T).getNode(2));
4325 distance1 = dist->at(elements->getElement(T).getNode(0));
4326 distance2 = dist->at(elements->getElement(T).getNode(1));
4327 distance3 = dist->at(elements->getElement(T).getNode(2));
4329 distance_mean.at(0) = (distance1 + distance2 + distance3)/3.0;
4330 double funcvalue = func(&distance_mean.at(0),parameters);
4333 detB = B.computeInverse(Binv);
4334 absDetB = std::fabs(detB);
4337 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
4338 applyBTinv( dPhi, dPhiTrans, Binv );
4340 for (
int i = 0; i < dPhi->at(0).size(); i++)
4342 Teuchos::Array<SC> value( 1, 0. );
4343 Teuchos::Array<GO> indices( 1, 0 );
4345 for (
int j = 0; j < dPhi->at(0).size(); j++)
4348 for (
int k = 0; k < dPhi->size(); k++)
4351 value1_j = dPhiTrans.at(k).at(j).at(0);
4352 value2_j = dPhiTrans.at(k).at(j).at(1);
4354 value1_i = dPhiTrans.at(k).at(i).at(0);
4355 value2_i = dPhiTrans.at(k).at(i).at(1);
4357 val = val + funcvalue * weightsDPhi->at(k) * ( value1_j*value1_i + value2_j*value2_i );
4359 val = absDetB * val;
4362 glob_j = dim * map->getGlobalElement(elements->getElement(T).getNode(j));
4363 glob_i = dim * map->getGlobalElement(elements->getElement(T).getNode(i));
4364 indices[0] = glob_j;
4367 A->insertGlobalValues(glob_i, indices(), value());
4369 indices[0] = glob_j;
4370 A->insertGlobalValues(glob_i+1, indices(), value());
4374 if (callFillComplete)
4381 double val, value1_j, value2_j ,value3_j, value1_i, value2_i ,value3_i;
4383 long long glob_i, glob_j;
4384 vec_dbl_Type p1(3,0.0), p2(3,0.0), p3(3,0.0), p4(3,0.0);
4386 double distance1, distance2, distance3, distance4;
4387 vec_dbl_Type distance_mean(1);
4388 for (
int T = 0; T < elements->numberElements(); T++)
4390 p1 = pointsRep->at(elements->getElement(T).getNode(0));
4391 p2 = pointsRep->at(elements->getElement(T).getNode(1));
4392 p3 = pointsRep->at(elements->getElement(T).getNode(2));
4393 p4 = pointsRep->at(elements->getElement(T).getNode(3));
4395 distance1 = dist->at(elements->getElement(T).getNode(0));
4396 distance2 = dist->at(elements->getElement(T).getNode(1));
4397 distance3 = dist->at(elements->getElement(T).getNode(2));
4398 distance4 = dist->at(elements->getElement(T).getNode(3));
4400 distance_mean.at(0) = (distance1 + distance2 + distance3 + distance4)/4.0;
4401 double funcvalue = func(&distance_mean.at(0),parameters);
4404 detB = B.computeInverse(Binv);
4405 absDetB = std::fabs(detB);
4408 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
4409 applyBTinv( dPhi, dPhiTrans, Binv );
4411 for (
int i = 0; i < dPhi->at(0).size(); i++)
4413 Teuchos::Array<SC> value( 1, 0. );
4414 Teuchos::Array<GO> indices( 1, 0 );
4416 for (
int j = 0; j < dPhi->at(0).size(); j++)
4419 for (
int k = 0; k < dPhi->size(); k++)
4421 value1_j = dPhiTrans.at(k).at(j).at(0);
4422 value2_j = dPhiTrans.at(k).at(j).at(1);
4423 value3_j = dPhiTrans.at(k).at(j).at(2);
4425 value1_i = dPhiTrans.at(k).at(i).at(0);
4426 value2_i = dPhiTrans.at(k).at(i).at(1);
4427 value3_i = dPhiTrans.at(k).at(i).at(2);
4429 val = val + funcvalue * weightsDPhi->at(k) * (value1_j*value1_i + value2_j*value2_i + value3_j*value3_i);
4431 val = absDetB * val;
4434 glob_j = dim * map->getGlobalElement(elements->getElement(T).getNode(j));
4435 glob_i = dim * map->getGlobalElement(elements->getElement(T).getNode(i));
4436 indices[0] = glob_j;
4437 A->insertGlobalValues(glob_i, indices(), value());
4439 indices[0] = glob_j;
4440 A->insertGlobalValues(glob_i+1, indices(), value());
4442 indices[0] = glob_j;
4443 A->insertGlobalValues(glob_i+2, indices(), value());
4448 if (callFillComplete)
4458template <
class SC,
class LO,
class GO,
class NO>
4462 CoeffFunc_Type func,
4464 bool callFillComplete)
4467 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
4468 int FEloc = this->checkFE(dim,FEType);
4470 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
4471 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
4472 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
4474 vec3D_dbl_ptr_Type dPhi;
4475 vec_dbl_ptr_Type weightsDPhi = Teuchos::rcp(
new vec_dbl_Type(0));
4476 vec2D_dbl_ptr_Type quadPts;
4494 double v11, v12, v21, v22, value1_j, value2_j , value1_i, value2_i;
4495 double e_11_j_1,e_12_j_1,e_21_j_1,e_22_j_1;
4496 double e_11_j_2,e_12_j_2,e_21_j_2,e_22_j_2;
4497 double e_11_i_1,e_12_i_1,e_21_i_1,e_22_i_1;
4498 double e_11_i_2,e_12_i_2,e_21_i_2,e_22_i_2;
4507 long long glob_i, glob_j;
4508 vec_dbl_Type p1(3,0.0), p2(3,0.0), p3(3,0.0);
4511 for (
int T = 0; T < elements->numberElements(); T++)
4513 p1 = pointsRep->at(elements->getElement(T).getNode(0));
4514 p2 = pointsRep->at(elements->getElement(T).getNode(1));
4515 p3 = pointsRep->at(elements->getElement(T).getNode(2));
4518 detB = B.computeInverse(Binv);
4519 absDetB = std::fabs(detB);
4523 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
4524 applyBTinv( dPhi, dPhiTrans, Binv );
4526 for (
int i = 0; i < dPhi->at(0).size(); i++)
4528 Teuchos::Array<SC> value11( 1, 0. );
4529 Teuchos::Array<SC> value12( 1, 0. );
4530 Teuchos::Array<SC> value21( 1, 0. );
4531 Teuchos::Array<SC> value22( 1, 0. );
4532 Teuchos::Array<GO> indices( 1, 0 );
4534 for (
int j=0; j < dPhi->at(0).size(); j++)
4536 v11 = 0.0;v12 = 0.0;v21 = 0.0;v22 = 0.0;
4537 for (
int k = 0; k < dPhi->size(); k++)
4542 for (
int r=0; r<2; r++) {
4543 xy[0] += B[0][r]*quadPts->at(k).at(r);
4544 xy[1] += B[1][r]*quadPts->at(k).at(r);
4549 value1_j = dPhiTrans.at(k).at(j).at(0);
4550 value2_j = dPhiTrans.at(k).at(j).at(1);
4552 value1_i = dPhiTrans.at(k).at(i).at(0);
4553 value2_i = dPhiTrans.at(k).at(i).at(1);
4555 tmpRes1[0][0] = value1_j;
4556 tmpRes1[0][1] = value2_j;
4560 tmpRes2[0][0] = value1_j;
4562 tmpRes2[1][0] = value2_j;
4565 tmpRes1.add(tmpRes2,e1j);
4567 e1i[0][0] = value1_i;
4568 e1i[0][1] = value2_i;
4573 tmpRes1[1][0] = value1_j;
4574 tmpRes1[1][1] = value2_j;
4577 tmpRes2[0][1] = value1_j;
4579 tmpRes2[1][1] = value2_j;
4581 tmpRes1.add(tmpRes2,e2j);
4583 e2i[1][0] = value1_i;
4584 e2i[1][1] = value2_i;
4586 double funcvalue = func(&xy.at(0),parameters);
4587 v11 = v11 + funcvalue * weightsDPhi->at(k) * e1i.innerProduct(e1j);
4588 v12 = v12 + funcvalue * weightsDPhi->at(k) * e1i.innerProduct(e2j);
4589 v21 = v21 + funcvalue * weightsDPhi->at(k) * e2i.innerProduct(e1j);
4590 v22 = v22 + funcvalue * weightsDPhi->at(k) * e2i.innerProduct(e2j);
4594 v11 = absDetB * v11;
4595 v12 = absDetB * v12;
4596 v21 = absDetB * v21;
4597 v22 = absDetB * v22;
4604 glob_j = dim * map->getGlobalElement(elements->getElement(T).getNode(j));
4605 glob_i = dim * map->getGlobalElement(elements->getElement(T).getNode(i));
4606 indices[0] = glob_j;
4608 A->insertGlobalValues(glob_i, indices(), value11());
4609 A->insertGlobalValues(glob_i+1, indices(), value21());
4611 indices[0] = glob_j;
4612 A->insertGlobalValues(glob_i, indices(), value12());
4613 A->insertGlobalValues(glob_i+1, indices(), value22());
4617 if (callFillComplete)
4624 double v11, v12, v13, v21, v22, v23, v31, v32, v33, value1_j, value2_j, value3_j , value1_i, value2_i, value3_i;
4633 vec_dbl_Type p1(3,0.0), p2(3,0.0), p3(3,0.0), p4(3,0.0);
4634 vec_dbl_Type xyz(3);
4636 for (
int T = 0; T < elements->numberElements(); T++)
4638 p1 = pointsRep->at(elements->getElement(T).getNode(0));
4639 p2 = pointsRep->at(elements->getElement(T).getNode(1));
4640 p3 = pointsRep->at(elements->getElement(T).getNode(2));
4641 p4 = pointsRep->at(elements->getElement(T).getNode(3));
4644 detB = B.computeInverse(Binv);
4645 absDetB = std::fabs(detB);
4648 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
4649 applyBTinv( dPhi, dPhiTrans, Binv );
4651 for (
int i = 0; i < dPhi->at(0).size(); i++)
4653 Teuchos::Array<SC> value11( 1, 0. );
4654 Teuchos::Array<SC> value12( 1, 0. );
4655 Teuchos::Array<SC> value13( 1, 0. );
4656 Teuchos::Array<SC> value21( 1, 0. );
4657 Teuchos::Array<SC> value22( 1, 0. );
4658 Teuchos::Array<SC> value23( 1, 0. );
4659 Teuchos::Array<SC> value31( 1, 0. );
4660 Teuchos::Array<SC> value32( 1, 0. );
4661 Teuchos::Array<SC> value33( 1, 0. );
4662 Teuchos::Array<GO> indices( 1, 0 );
4664 for (
int j = 0; j < dPhi->at(0).size(); j++)
4666 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;
4667 for (
int k = 0; k < dPhi->size(); k++)
4670 xyz[0]=0.; xyz[1]=0.; xyz[2]=0.;
4671 for (
int r = 0; r < 3; r++)
4673 xyz[0] += B[0][r]*quadPts->at(k).at(r);
4674 xyz[1] += B[1][r]*quadPts->at(k).at(r);
4675 xyz[2] += B[2][r]*quadPts->at(k).at(r);
4683 value1_j = dPhiTrans.at(k).at(j).at(0);
4684 value2_j = dPhiTrans.at(k).at(j).at(1);
4685 value3_j = dPhiTrans.at(k).at(j).at(2);
4688 value1_i = dPhiTrans.at(k).at(i).at(0);
4689 value2_i = dPhiTrans.at(k).at(i).at(1);
4690 value3_i = dPhiTrans.at(k).at(i).at(2);
4693 e1j[0][0] = 2.*value1_j;
4694 e1j[0][1] = value2_j;
4695 e1j[0][2] = value3_j;
4696 e1j[1][0] = value2_j;
4697 e1j[2][0] = value3_j;
4699 e1i[0][0] = value1_i;
4700 e1i[0][1] = value2_i;
4701 e1i[0][2] = value3_i;
4704 e2j[1][0] = value1_j;
4705 e2j[1][1] = 2.*value2_j;
4706 e2j[1][2] = value3_j;
4707 e2j[0][1] = value1_j;
4708 e2j[2][1] = value3_j;
4710 e2i[1][0] = value1_i;
4711 e2i[1][1] = value2_i;
4712 e2i[1][2] = value3_i;
4715 e3j[2][0] = value1_j;
4716 e3j[2][1] = value2_j;
4717 e3j[2][2] = 2.*value3_j;
4718 e3j[0][2] = value1_j;
4719 e3j[1][2] = value2_j;
4721 e3i[2][0] = value1_i;
4722 e3i[2][1] = value2_i;
4723 e3i[2][2] = value3_i;
4725 double funcvalue = func(&xyz.at(0),parameters);
4727 v11 = v11 + funcvalue * weightsDPhi->at(k) * e1i.innerProduct(e1j);
4728 v12 = v12 + funcvalue * weightsDPhi->at(k) * e1i.innerProduct(e2j);
4729 v13 = v13 + funcvalue * weightsDPhi->at(k) * e1i.innerProduct(e3j);
4731 v21 = v21 + funcvalue * weightsDPhi->at(k) * e2i.innerProduct(e1j);
4732 v22 = v22 + funcvalue * weightsDPhi->at(k) * e2i.innerProduct(e2j);
4733 v23 = v23 + funcvalue * weightsDPhi->at(k) * e2i.innerProduct(e3j);
4735 v31 = v31 + funcvalue * weightsDPhi->at(k) * e3i.innerProduct(e1j);
4736 v32 = v32 + funcvalue * weightsDPhi->at(k) * e3i.innerProduct(e2j);
4737 v33 = v33 + funcvalue * weightsDPhi->at(k) * e3i.innerProduct(e3j);
4741 v11 = absDetB * v11;
4742 v12 = absDetB * v12;
4743 v13 = absDetB * v13;
4744 v21 = absDetB * v21;
4745 v22 = absDetB * v22;
4746 v23 = absDetB * v23;
4747 v31 = absDetB * v31;
4748 v32 = absDetB * v32;
4749 v33 = absDetB * v33;
4761 glob_j = dim * map->getGlobalElement(elements->getElement(T).getNode(j));
4762 glob_i = dim * map->getGlobalElement(elements->getElement(T).getNode(i));
4763 indices[0] = glob_j;
4764 A->insertGlobalValues(glob_i, indices(), value11());
4765 A->insertGlobalValues(glob_i+1, indices(), value21());
4766 A->insertGlobalValues(glob_i+2, indices(), value31());
4769 indices[0] = glob_j;
4770 A->insertGlobalValues(glob_i, indices(), value12());
4771 A->insertGlobalValues(glob_i+1, indices(), value22());
4772 A->insertGlobalValues(glob_i+2, indices(), value32());
4775 indices[0] = glob_j;
4776 A->insertGlobalValues(glob_i, indices(), value13());
4777 A->insertGlobalValues(glob_i+1, indices(), value23());
4778 A->insertGlobalValues(glob_i+2, indices(), value33());
4782 if (callFillComplete)
4792template <
class SC,
class LO,
class GO,
class NO>
4798 bool callFillComplete)
4800 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
4801 int FEloc = this->checkFE(dim,FEType);
4804 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
4805 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
4806 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
4808 vec3D_dbl_ptr_Type dPhi;
4809 vec_dbl_ptr_Type weightsDPhi = Teuchos::rcp(
new vec_dbl_Type(0));
4810 vec2D_dbl_ptr_Type quadPts;
4832 double res_trace_i, res_trace_j;
4837 double v11, v12, v21, v22;
4839 vec_dbl_Type p1(2,0.0), p2(2,0.0), p3(2,0.0);
4844 epsilonValuesMat1_j(dim), epsilonValuesMat2_j(dim);
4846 for (
int T = 0; T < elements->numberElements(); T++)
4849 p1 = pointsRep->at(elements->getElement(T).getNode(0));
4850 p2 = pointsRep->at(elements->getElement(T).getNode(1));
4851 p3 = pointsRep->at(elements->getElement(T).getNode(2));
4855 detB = B.computeInverse(Binv);
4856 absDetB = std::fabs(detB);
4860 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
4861 applyBTinv( dPhi, dPhiTrans, Binv );
4863 for (
int i = 0; i < dPhi->at(0).size(); i++)
4865 Teuchos::Array<SC> value11( 1, 0. );
4866 Teuchos::Array<SC> value12( 1, 0. );
4867 Teuchos::Array<SC> value21( 1, 0. );
4868 Teuchos::Array<SC> value22( 1, 0. );
4869 Teuchos::Array<GO> indices( 1, 0 );
4871 for (
int j = 0; j < dPhi->at(0).size(); j++)
4873 v11 = 0.0; v12 = 0.0; v21 = 0.0; v22 = 0.0;
4874 for (
int k = 0; k < dPhi->size(); k++)
4884 epsilonTensor( dPhiTrans.at(k).at(i), epsilonValuesMat1_i, 0);
4885 epsilonTensor( dPhiTrans.at(k).at(i), epsilonValuesMat2_i, 1);
4891 epsilonTensor( dPhiTrans.at(k).at(j), epsilonValuesMat1_j, 0);
4892 epsilonTensor( dPhiTrans.at(k).at(j), epsilonValuesMat2_j, 1);
4897 epsilonValuesMat1_i.innerProduct(epsilonValuesMat1_j, res);
4898 epsilonValuesMat1_i.trace(res_trace_i);
4899 epsilonValuesMat1_j.trace(res_trace_j);
4900 v11 = v11 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
4902 epsilonValuesMat1_i.innerProduct(epsilonValuesMat2_j, res);
4903 epsilonValuesMat1_i.trace(res_trace_i);
4904 epsilonValuesMat2_j.trace(res_trace_j);
4905 v12 = v12 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
4907 epsilonValuesMat2_i.innerProduct(epsilonValuesMat1_j, res);
4908 epsilonValuesMat2_i.trace(res_trace_i);
4909 epsilonValuesMat1_j.trace(res_trace_j);
4910 v21 = v21 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
4912 epsilonValuesMat2_i.innerProduct(epsilonValuesMat2_j, res);
4913 epsilonValuesMat2_i.trace(res_trace_i);
4914 epsilonValuesMat2_j.trace(res_trace_j);
4915 v22 = v22 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
4920 v11 = absDetB * v11;
4921 v12 = absDetB * v12;
4922 v21 = absDetB * v21;
4923 v22 = absDetB * v22;
4931 glob_j = dim * map->getGlobalElement(elements->getElement(T).getNode(j));
4932 glob_i = dim * map->getGlobalElement(elements->getElement(T).getNode(i));
4933 indices[0] = glob_j;
4934 A->insertGlobalValues(glob_i, indices(), value11());
4935 A->insertGlobalValues(glob_i+1, indices(), value21());
4937 indices[0] = glob_j;
4938 A->insertGlobalValues(glob_i, indices(), value12());
4939 A->insertGlobalValues(glob_i+1, indices(), value22());
4943 if (callFillComplete)
4951 double v11, v12, v13, v21, v22, v23, v31, v32, v33;
4953 vec_dbl_Type p1(3,0.0), p2(3,0.0), p3(3,0.0), p4(3,0.0);
4954 SmallMatrix<double> epsilonValuesMat1_i(dim), epsilonValuesMat2_i(dim), epsilonValuesMat3_i(dim),
4955 epsilonValuesMat1_j(dim), epsilonValuesMat2_j(dim), epsilonValuesMat3_j(dim);
4957 for (
int T = 0; T < elements->numberElements(); T++)
4959 p1 = pointsRep->at(elements->getElement(T).getNode(0));
4960 p2 = pointsRep->at(elements->getElement(T).getNode(1));
4961 p3 = pointsRep->at(elements->getElement(T).getNode(2));
4962 p4 = pointsRep->at(elements->getElement(T).getNode(3));
4965 detB = B.computeInverse(Binv);
4966 absDetB = std::fabs(detB);
4969 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
4970 applyBTinv( dPhi, dPhiTrans, Binv );
4972 for (
int i = 0; i < dPhi->at(0).size(); i++)
4974 Teuchos::Array<SC> value11( 1, 0. );
4975 Teuchos::Array<SC> value12( 1, 0. );
4976 Teuchos::Array<SC> value13( 1, 0. );
4977 Teuchos::Array<SC> value21( 1, 0. );
4978 Teuchos::Array<SC> value22( 1, 0. );
4979 Teuchos::Array<SC> value23( 1, 0. );
4980 Teuchos::Array<SC> value31( 1, 0. );
4981 Teuchos::Array<SC> value32( 1, 0. );
4982 Teuchos::Array<SC> value33( 1, 0. );
4983 Teuchos::Array<GO> indices( 1, 0 );
4985 for (
int j = 0; j < dPhi->at(0).size(); j++)
4987 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;
4988 for (
int k = 0; k < dPhi->size(); k++)
4993 epsilonTensor( dPhiTrans.at(k).at(i), epsilonValuesMat1_i, 0);
4994 epsilonTensor( dPhiTrans.at(k).at(i), epsilonValuesMat2_i, 1);
4995 epsilonTensor( dPhiTrans.at(k).at(i), epsilonValuesMat3_i, 2);
5000 epsilonTensor( dPhiTrans.at(k).at(j), epsilonValuesMat1_j, 0);
5001 epsilonTensor( dPhiTrans.at(k).at(j), epsilonValuesMat2_j, 1);
5002 epsilonTensor( dPhiTrans.at(k).at(j), epsilonValuesMat3_j, 2);
5004 epsilonValuesMat1_i.innerProduct(epsilonValuesMat1_j, res);
5005 epsilonValuesMat1_i.trace(res_trace_i);
5006 epsilonValuesMat1_j.trace(res_trace_j);
5007 v11 = v11 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5009 epsilonValuesMat1_i.innerProduct(epsilonValuesMat2_j, res);
5010 epsilonValuesMat1_i.trace(res_trace_i);
5011 epsilonValuesMat2_j.trace(res_trace_j);
5012 v12 = v12 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5014 epsilonValuesMat1_i.innerProduct(epsilonValuesMat3_j, res);
5015 epsilonValuesMat1_i.trace(res_trace_i);
5016 epsilonValuesMat3_j.trace(res_trace_j);
5017 v13 = v13 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5019 epsilonValuesMat2_i.innerProduct(epsilonValuesMat1_j, res);
5020 epsilonValuesMat2_i.trace(res_trace_i);
5021 epsilonValuesMat1_j.trace(res_trace_j);
5022 v21 = v21 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5024 epsilonValuesMat2_i.innerProduct(epsilonValuesMat2_j, res);
5025 epsilonValuesMat2_i.trace(res_trace_i);
5026 epsilonValuesMat2_j.trace(res_trace_j);
5027 v22 = v22 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5029 epsilonValuesMat2_i.innerProduct(epsilonValuesMat3_j, res);
5030 epsilonValuesMat2_i.trace(res_trace_i);
5031 epsilonValuesMat3_j.trace(res_trace_j);
5032 v23 = v23 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5034 epsilonValuesMat3_i.innerProduct(epsilonValuesMat1_j, res);
5035 epsilonValuesMat3_i.trace(res_trace_i);
5036 epsilonValuesMat1_j.trace(res_trace_j);
5037 v31 = v31 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5039 epsilonValuesMat3_i.innerProduct(epsilonValuesMat2_j, res);
5040 epsilonValuesMat3_i.trace(res_trace_i);
5041 epsilonValuesMat2_j.trace(res_trace_j);
5042 v32 = v32 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5044 epsilonValuesMat3_i.innerProduct(epsilonValuesMat3_j, res);
5045 epsilonValuesMat3_i.trace(res_trace_i);
5046 epsilonValuesMat3_j.trace(res_trace_j);
5047 v33 = v33 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5050 v11 = absDetB * v11;
5051 v12 = absDetB * v12;
5052 v13 = absDetB * v13;
5053 v21 = absDetB * v21;
5054 v22 = absDetB * v22;
5055 v23 = absDetB * v23;
5056 v31 = absDetB * v31;
5057 v32 = absDetB * v32;
5058 v33 = absDetB * v33;
5070 glob_j = dim * map->getGlobalElement(elements->getElement(T).getNode(j));
5071 glob_i = dim * map->getGlobalElement(elements->getElement(T).getNode(i));
5072 indices[0] = glob_j;
5073 A->insertGlobalValues(glob_i, indices(), value11());
5074 A->insertGlobalValues(glob_i+1, indices(), value21());
5075 A->insertGlobalValues(glob_i+2, indices(), value31());
5077 indices[0] = glob_j;
5078 A->insertGlobalValues(glob_i, indices(), value12());
5079 A->insertGlobalValues(glob_i+1, indices(), value22());
5080 A->insertGlobalValues(glob_i+2, indices(), value32());
5082 indices[0] = glob_j;
5083 A->insertGlobalValues(glob_i, indices(), value13());
5084 A->insertGlobalValues(glob_i+1, indices(), value23());
5085 A->insertGlobalValues(glob_i+2, indices(), value33());
5089 if (callFillComplete)
5097template <
class SC,
class LO,
class GO,
class NO>
5098void FE<SC,LO,GO,NO>::determineEMod(std::string FEType, MultiVectorPtr_Type solution,MultiVectorPtr_Type &eModVec, DomainConstPtr_Type domain, ParameterListPtr_Type params){
5101 ElementsPtr_Type elements = domain->getElementsC();
5103 int dim = domain->getDimension();
5104 vec2D_dbl_ptr_Type pointsRep = domain->getPointsRepeated();
5108 Teuchos::ArrayRCP< const SC > uArray = solution->getData(0);
5109 Teuchos::ArrayRCP< SC > eModVecA = eModVec->getDataNonConst(0);
5111 double E0 = params->sublist(
"Parameter Solid").get(
"E",3.0e+6);
5112 double E1 = params->sublist(
"Parameter Solid").get(
"E1",3.0e+5);
5113 double c1 = params->sublist(
"Parameter Solid").get(
"c1",1.0);
5115 double eModMin = E0;
5117 int nodesElement = elements->getElement(0).getVectorNodeList().size();
5118 for (UN T=0; T<elements->numberElements(); T++) {
5126 for(
int i=0; i< nodesElement;i++){
5127 LO index = elements->getElement(T).getNode(i) ;
5128 uLoc += 1./nodesElement*uArray[index];
5131 eModVecA[T] = E0-(E0-E1)*(uLoc/(uLoc+c1));
5132 if(eModVecA[T] > eModMax )
5133 eModMax = eModVecA[T];
5134 if(eModVecA[T] < eModMin)
5135 eModMin = eModVecA[T];
5137 Teuchos::reduceAll<int, double> (*(domain->getComm()), Teuchos::REDUCE_MIN, eModMin, Teuchos::outArg (eModMin));
5138 Teuchos::reduceAll<int, double> (*(domain->getComm()), Teuchos::REDUCE_MAX, eModMax, Teuchos::outArg (eModMax));
5140 if(domain->getComm()->getRank()==0)
5141 std::cout <<
" ################# eMOD Min: " << eModMin <<
" \t eModMax: " << eModMax<<
" ############# " << std::endl;
5148template <
class SC,
class LO,
class GO,
class NO>
5152 MultiVectorPtr_Type eModVec,
5154 bool callFillComplete)
5156 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
5157 int FEloc = this->checkFE(dim,FEType);
5159 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
5160 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
5161 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
5163 vec3D_dbl_ptr_Type dPhi;
5164 vec_dbl_ptr_Type weightsDPhi = Teuchos::rcp(
new vec_dbl_Type(0));
5165 vec2D_dbl_ptr_Type quadPts;
5183 double res_trace_i, res_trace_j;
5185 Teuchos::ArrayRCP< const SC > E = eModVec->getData(0);
5192 double v11, v12, v21, v22;
5194 vec_dbl_Type p1(2,0.0), p2(2,0.0), p3(2,0.0);
5199 epsilonValuesMat1_j(dim), epsilonValuesMat2_j(dim);
5201 for (
int T = 0; T < elements->numberElements(); T++)
5204 lambda = E[T]* nu / ((1.+nu)*(1.-2.*nu));
5205 mu = E[T] / (2.*(1.+nu));
5208 p1 = pointsRep->at(elements->getElement(T).getNode(0));
5209 p2 = pointsRep->at(elements->getElement(T).getNode(1));
5210 p3 = pointsRep->at(elements->getElement(T).getNode(2));
5214 detB = B.computeInverse(Binv);
5215 absDetB = std::fabs(detB);
5219 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
5220 applyBTinv( dPhi, dPhiTrans, Binv );
5222 for (
int i = 0; i < dPhi->at(0).size(); i++)
5224 Teuchos::Array<SC> value11( 1, 0. );
5225 Teuchos::Array<SC> value12( 1, 0. );
5226 Teuchos::Array<SC> value21( 1, 0. );
5227 Teuchos::Array<SC> value22( 1, 0. );
5228 Teuchos::Array<GO> indices( 1, 0 );
5230 for (
int j = 0; j < dPhi->at(0).size(); j++)
5232 v11 = 0.0; v12 = 0.0; v21 = 0.0; v22 = 0.0;
5233 for (
int k = 0; k < dPhi->size(); k++)
5243 epsilonTensor( dPhiTrans.at(k).at(i), epsilonValuesMat1_i, 0);
5244 epsilonTensor( dPhiTrans.at(k).at(i), epsilonValuesMat2_i, 1);
5250 epsilonTensor( dPhiTrans.at(k).at(j), epsilonValuesMat1_j, 0);
5251 epsilonTensor( dPhiTrans.at(k).at(j), epsilonValuesMat2_j, 1);
5256 epsilonValuesMat1_i.innerProduct(epsilonValuesMat1_j, res);
5257 epsilonValuesMat1_i.trace(res_trace_i);
5258 epsilonValuesMat1_j.trace(res_trace_j);
5259 v11 = v11 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5261 epsilonValuesMat1_i.innerProduct(epsilonValuesMat2_j, res);
5262 epsilonValuesMat1_i.trace(res_trace_i);
5263 epsilonValuesMat2_j.trace(res_trace_j);
5264 v12 = v12 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5266 epsilonValuesMat2_i.innerProduct(epsilonValuesMat1_j, res);
5267 epsilonValuesMat2_i.trace(res_trace_i);
5268 epsilonValuesMat1_j.trace(res_trace_j);
5269 v21 = v21 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5271 epsilonValuesMat2_i.innerProduct(epsilonValuesMat2_j, res);
5272 epsilonValuesMat2_i.trace(res_trace_i);
5273 epsilonValuesMat2_j.trace(res_trace_j);
5274 v22 = v22 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5279 v11 = absDetB * v11;
5280 v12 = absDetB * v12;
5281 v21 = absDetB * v21;
5282 v22 = absDetB * v22;
5290 glob_j = dim * map->getGlobalElement(elements->getElement(T).getNode(j));
5291 glob_i = dim * map->getGlobalElement(elements->getElement(T).getNode(i));
5292 indices[0] = glob_j;
5293 A->insertGlobalValues(glob_i, indices(), value11());
5294 A->insertGlobalValues(glob_i+1, indices(), value21());
5296 indices[0] = glob_j;
5297 A->insertGlobalValues(glob_i, indices(), value12());
5298 A->insertGlobalValues(glob_i+1, indices(), value22());
5302 if (callFillComplete)
5310 double v11, v12, v13, v21, v22, v23, v31, v32, v33;
5312 vec_dbl_Type p1(3,0.0), p2(3,0.0), p3(3,0.0), p4(3,0.0);
5313 SmallMatrix<double> epsilonValuesMat1_i(dim), epsilonValuesMat2_i(dim), epsilonValuesMat3_i(dim),
5314 epsilonValuesMat1_j(dim), epsilonValuesMat2_j(dim), epsilonValuesMat3_j(dim);
5316 for (
int T = 0; T < elements->numberElements(); T++)
5318 lambda = E[T]* nu / ((1.+nu)*(1.-2.*nu));
5319 mu = E[T] / (2.*(1.+nu));
5321 p1 = pointsRep->at(elements->getElement(T).getNode(0));
5322 p2 = pointsRep->at(elements->getElement(T).getNode(1));
5323 p3 = pointsRep->at(elements->getElement(T).getNode(2));
5324 p4 = pointsRep->at(elements->getElement(T).getNode(3));
5327 detB = B.computeInverse(Binv);
5328 absDetB = std::fabs(detB);
5331 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
5332 applyBTinv( dPhi, dPhiTrans, Binv );
5334 for (
int i = 0; i < dPhi->at(0).size(); i++)
5337 Teuchos::Array<SC> value11( 1, 0. );
5338 Teuchos::Array<SC> value12( 1, 0. );
5339 Teuchos::Array<SC> value13( 1, 0. );
5340 Teuchos::Array<SC> value21( 1, 0. );
5341 Teuchos::Array<SC> value22( 1, 0. );
5342 Teuchos::Array<SC> value23( 1, 0. );
5343 Teuchos::Array<SC> value31( 1, 0. );
5344 Teuchos::Array<SC> value32( 1, 0. );
5345 Teuchos::Array<SC> value33( 1, 0. );
5346 Teuchos::Array<GO> indices( 1, 0 );
5348 for (
int j = 0; j < dPhi->at(0).size(); j++)
5350 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;
5351 for (
int k = 0; k < dPhi->size(); k++)
5356 epsilonTensor( dPhiTrans.at(k).at(i), epsilonValuesMat1_i, 0);
5357 epsilonTensor( dPhiTrans.at(k).at(i), epsilonValuesMat2_i, 1);
5358 epsilonTensor( dPhiTrans.at(k).at(i), epsilonValuesMat3_i, 2);
5363 epsilonTensor( dPhiTrans.at(k).at(j), epsilonValuesMat1_j, 0);
5364 epsilonTensor( dPhiTrans.at(k).at(j), epsilonValuesMat2_j, 1);
5365 epsilonTensor( dPhiTrans.at(k).at(j), epsilonValuesMat3_j, 2);
5367 epsilonValuesMat1_i.innerProduct(epsilonValuesMat1_j, res);
5368 epsilonValuesMat1_i.trace(res_trace_i);
5369 epsilonValuesMat1_j.trace(res_trace_j);
5370 v11 = v11 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5372 epsilonValuesMat1_i.innerProduct(epsilonValuesMat2_j, res);
5373 epsilonValuesMat1_i.trace(res_trace_i);
5374 epsilonValuesMat2_j.trace(res_trace_j);
5375 v12 = v12 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5377 epsilonValuesMat1_i.innerProduct(epsilonValuesMat3_j, res);
5378 epsilonValuesMat1_i.trace(res_trace_i);
5379 epsilonValuesMat3_j.trace(res_trace_j);
5380 v13 = v13 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5382 epsilonValuesMat2_i.innerProduct(epsilonValuesMat1_j, res);
5383 epsilonValuesMat2_i.trace(res_trace_i);
5384 epsilonValuesMat1_j.trace(res_trace_j);
5385 v21 = v21 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5387 epsilonValuesMat2_i.innerProduct(epsilonValuesMat2_j, res);
5388 epsilonValuesMat2_i.trace(res_trace_i);
5389 epsilonValuesMat2_j.trace(res_trace_j);
5390 v22 = v22 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5392 epsilonValuesMat2_i.innerProduct(epsilonValuesMat3_j, res);
5393 epsilonValuesMat2_i.trace(res_trace_i);
5394 epsilonValuesMat3_j.trace(res_trace_j);
5395 v23 = v23 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5397 epsilonValuesMat3_i.innerProduct(epsilonValuesMat1_j, res);
5398 epsilonValuesMat3_i.trace(res_trace_i);
5399 epsilonValuesMat1_j.trace(res_trace_j);
5400 v31 = v31 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5402 epsilonValuesMat3_i.innerProduct(epsilonValuesMat2_j, res);
5403 epsilonValuesMat3_i.trace(res_trace_i);
5404 epsilonValuesMat2_j.trace(res_trace_j);
5405 v32 = v32 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5407 epsilonValuesMat3_i.innerProduct(epsilonValuesMat3_j, res);
5408 epsilonValuesMat3_i.trace(res_trace_i);
5409 epsilonValuesMat3_j.trace(res_trace_j);
5410 v33 = v33 + weightsDPhi->at(k)*(2*mu*res + lambda*res_trace_j*res_trace_i);
5413 v11 = absDetB * v11;
5414 v12 = absDetB * v12;
5415 v13 = absDetB * v13;
5416 v21 = absDetB * v21;
5417 v22 = absDetB * v22;
5418 v23 = absDetB * v23;
5419 v31 = absDetB * v31;
5420 v32 = absDetB * v32;
5421 v33 = absDetB * v33;
5433 glob_j = dim * map->getGlobalElement(elements->getElement(T).getNode(j));
5434 glob_i = dim * map->getGlobalElement(elements->getElement(T).getNode(i));
5435 indices[0] = glob_j;
5436 A->insertGlobalValues(glob_i, indices(), value11());
5437 A->insertGlobalValues(glob_i+1, indices(), value21());
5438 A->insertGlobalValues(glob_i+2, indices(), value31());
5440 indices[0] = glob_j;
5441 A->insertGlobalValues(glob_i, indices(), value12());
5442 A->insertGlobalValues(glob_i+1, indices(), value22());
5443 A->insertGlobalValues(glob_i+2, indices(), value32());
5445 indices[0] = glob_j;
5446 A->insertGlobalValues(glob_i, indices(), value13());
5447 A->insertGlobalValues(glob_i+1, indices(), value23());
5448 A->insertGlobalValues(glob_i+2, indices(), value33());
5452 if (callFillComplete)
5460template <
class SC,
class LO,
class GO,
class NO>
5464 MultiVectorPtr_Type w,
5465 bool callFillComplete)
5468 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
5469 int FEloc = this->checkFE(dim,FEType);
5471 DomainConstPtr_Type domain = domainVec_.at(FEloc);
5472 ElementsPtr_Type elements = domain->getElementsC();
5473 vec2D_dbl_ptr_Type pointsRep = domain->getPointsRepeated();
5474 MapConstPtr_Type map = domain->getMapRepeated();
5476 vec3D_dbl_ptr_Type dPhi;
5477 vec2D_dbl_ptr_Type phi;
5478 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
5479 vec2D_dbl_ptr_Type quadPts;
5496 Teuchos::ArrayRCP< const SC > wArray = w->getData(0);
5501 vec_dbl_Type p1(3,0.0), p2(3,0.0), p3(3,0.0);
5503 vec2D_dbl_Type w11(1, vec_dbl_Type(weights->size(), -1.));
5504 vec2D_dbl_Type w22(1, vec_dbl_Type(weights->size(), -1.));
5505 vec2D_dbl_Type divergenz(1, vec_dbl_Type(weights->size(), -1.));
5507 for (
int T = 0; T < elements->numberElements(); T++)
5509 p1 = pointsRep->at(elements->getElement(T).getNode(0));
5510 p2 = pointsRep->at(elements->getElement(T).getNode(1));
5511 p3 = pointsRep->at(elements->getElement(T).getNode(2));
5514 detB = B.computeInverse(Binv);
5515 absDetB = std::fabs(detB);
5518 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
5519 applyBTinv( dPhi, dPhiTrans, Binv );
5523 for(
int k = 0; k < dPhiTrans.size(); k++)
5527 for(
int i = 0; i < dPhiTrans[0].size(); i++)
5529 LO index1 = dim * elements->getElement(T).getNode(i) + 0;
5530 LO index2 = dim * elements->getElement(T).getNode(i) + 1;
5531 w11[0][k] += wArray[index1] * dPhiTrans[k][i][0];
5532 w22[0][k] += wArray[index2] * dPhiTrans[k][i][1];
5542 for(
int k = 0; k < dPhiTrans.size(); k++)
5544 divergenz[0][k] = w11[0][k] + w22[0][k];
5552 for (
int i = 0; i < dPhi->at(0).size(); i++)
5554 Teuchos::Array<SC> value( 1, 0. );
5555 Teuchos::Array<GO> indices( 1, 0 );
5557 for (
int j = 0; j < dPhi->at(0).size(); j++)
5560 for (
int k = 0; k < dPhi->size(); k++)
5562 val = val + divergenz[0][k] * weights->at(k) * (*phi)[k][i] * (*phi)[k][j];
5564 val = absDetB * val;
5572 glob_j = dim * map->getGlobalElement(elements->getElement(T).getNode(j));
5573 glob_i = dim * map->getGlobalElement(elements->getElement(T).getNode(i));
5574 indices[0] = glob_j;
5576 A->insertGlobalValues(glob_i, indices(), value());
5578 indices[0] = glob_j;
5579 A->insertGlobalValues(glob_i+1, indices(), value());
5583 if (callFillComplete)
5593 vec_dbl_Type p1(3,0.0), p2(3,0.0), p3(3,0.0), p4(3,0.0);
5595 vec2D_dbl_Type w11(1, vec_dbl_Type(weights->size(), -1.));
5596 vec2D_dbl_Type w22(1, vec_dbl_Type(weights->size(), -1.));
5597 vec2D_dbl_Type w33(1, vec_dbl_Type(weights->size(), -1.));
5598 vec2D_dbl_Type divergenz(1, vec_dbl_Type(weights->size(), -1.));
5600 for (
int T = 0; T < elements->numberElements(); T++)
5602 p1 = pointsRep->at(elements->getElement(T).getNode(0));
5603 p2 = pointsRep->at(elements->getElement(T).getNode(1));
5604 p3 = pointsRep->at(elements->getElement(T).getNode(2));
5605 p4 = pointsRep->at(elements->getElement(T).getNode(3));
5608 detB = B.computeInverse(Binv);
5609 absDetB = std::fabs(detB);
5612 vec3D_dbl_Type dPhiTrans( dPhi->size(), vec2D_dbl_Type( dPhi->at(0).size(), vec_dbl_Type(dim,0.) ) );
5613 applyBTinv( dPhi, dPhiTrans, Binv );
5617 for(
int k = 0; k < dPhiTrans.size(); k++)
5622 for(
int i = 0; i < dPhiTrans[0].size(); i++)
5624 LO index1 = dim * elements->getElement(T).getNode(i) + 0;
5625 LO index2 = dim * elements->getElement(T).getNode(i) + 1;
5626 LO index3 = dim * elements->getElement(T).getNode(i) + 2;
5627 w11[0][k] += wArray[index1] * dPhiTrans[k][i][0];
5628 w22[0][k] += wArray[index2] * dPhiTrans[k][i][1];
5629 w33[0][k] += wArray[index3] * dPhiTrans[k][i][2];
5633 for(
int k = 0; k < dPhiTrans.size(); k++)
5635 divergenz[0][k] = w11[0][k] + w22[0][k] + w33[0][k];
5638 for (
int i = 0; i < dPhi->at(0).size(); i++)
5640 Teuchos::Array<SC> value( 1, 0. );
5641 Teuchos::Array<GO> indices( 1, 0 );
5643 for (
int j = 0; j < dPhi->at(0).size(); j++)
5646 for (
int k = 0; k < dPhi->size(); k++)
5648 val = val + divergenz[0][k] * weights->at(k) * (*phi)[k][i] * (*phi)[k][j];
5650 val = absDetB * val;
5653 glob_j = dim * map->getGlobalElement(elements->getElement(T).getNode(j));
5654 glob_i = dim * map->getGlobalElement(elements->getElement(T).getNode(i));
5655 indices[0] = glob_j;
5656 A->insertGlobalValues(glob_i, indices(), value());
5658 indices[0] = glob_j;
5659 A->insertGlobalValues(glob_i+1, indices(), value());
5661 indices[0] = glob_j;
5662 A->insertGlobalValues(glob_i+2, indices(), value());
5667 if (callFillComplete)
5674template <
class SC,
class LO,
class GO,
class NO>
5675void FE<SC,LO,GO,NO>::assemblyDummyCoupling(
int dim,
5679 bool callFillComplete)
5681 DomainConstPtr_Type domain = domainVec_.at(FEloc);
5683 MapConstPtr_Type mapInterfaceVecField = domain->getInterfaceMapVecFieldUnique();
5684 MapConstPtr_Type mapGlobalInterfaceVecField = domain->getGlobalInterfaceMapVecFieldUnique();
5686 MapConstPtr_Type mapFieldPartial = domain->getGlobalInterfaceMapVecFieldPartial();
5688 Teuchos::Array<SC> value( 1, 0. );
5690 Teuchos::Array<GO> indices( 1, 0 );
5692 GO dofGlobal, dofLocal;
5694 for(
int k = 0; k < mapGlobalInterfaceVecField->getNodeNumElements(); k++)
5696 dofGlobal = mapGlobalInterfaceVecField->getGlobalElement(k);
5697 if ( mapFieldPartial->getLocalElement( dofGlobal ) == Teuchos::OrdinalTraits<LO>::invalid() ) {
5699 dofGlobal = mapInterfaceVecField->getGlobalElement( k );
5700 indices[0] = dofGlobal;
5701 C->insertGlobalValues(dofGlobal, indices(), value());
5705 if (callFillComplete)
5706 C->fillComplete(mapInterfaceVecField, mapInterfaceVecField);
5710template <
class SC,
class LO,
class GO,
class NO>
5711void FE<SC,LO,GO,NO>::assemblyFSICoupling(
int dim,
5714 MatrixPtr_Type &C_T,
5717 MapConstPtr_Type map1,
5718 MapConstPtr_Type map2,
5719 bool callFillComplete)
5723 DomainConstPtr_Type domain1 = domainVec_.at(FEloc1);
5725 MapConstPtr_Type mapInterfaceVecField = domain1->getInterfaceMapVecFieldUnique();
5727 MapConstPtr_Type mapGlobalInterfaceVecField;
5728 MapConstPtr_Type mapFieldPartial;
5729 if (FEloc1!=FEloc2){
5730 mapFieldPartial = domain1->getOtherGlobalInterfaceMapVecFieldPartial();
5731 mapGlobalInterfaceVecField = domain1->getOtherGlobalInterfaceMapVecFieldUnique();
5734 mapFieldPartial = domain1->getGlobalInterfaceMapVecFieldPartial();
5735 mapGlobalInterfaceVecField = domain1->getGlobalInterfaceMapVecFieldUnique();
5738 Teuchos::Array<SC> value( 1, 0. );
5740 Teuchos::Array<GO> indices( 1, 0 );
5742 GO dofGlobal, dofLocal;
5743 if (mapFieldPartial.is_null()) {
5744 for(
int k = 0; k < mapGlobalInterfaceVecField->getNodeNumElements(); k++)
5747 dofGlobal = mapGlobalInterfaceVecField->getGlobalElement(k);
5748 dofLocal = mapInterfaceVecField->getGlobalElement(k);
5750 indices[0] = dofLocal;
5751 C_T->insertGlobalValues(dofGlobal, indices(), value());
5752 indices[0] = dofGlobal;
5753 C->insertGlobalValues(dofLocal, indices(), value());
5758 for(
int k = 0; k < mapGlobalInterfaceVecField->getNodeNumElements(); k++) {
5759 dofGlobal = mapGlobalInterfaceVecField->getGlobalElement(k);
5760 if ( mapFieldPartial->getLocalElement( dofGlobal ) != Teuchos::OrdinalTraits<LO>::invalid() ) {
5762 dofLocal = mapInterfaceVecField->getGlobalElement(k);
5764 indices[0] = dofLocal;
5765 C_T->insertGlobalValues(dofGlobal, indices(), value());
5766 indices[0] = dofGlobal;
5767 C->insertGlobalValues(dofLocal, indices(), value());
5772 if (callFillComplete)
5776 C_T->fillComplete(map1, map2);
5777 C->fillComplete(map2, map1);
5782template <
class SC,
class LO,
class GO,
class NO>
5783void FE<SC,LO,GO,NO>::assemblyGeometryCoupling(
int dim,
5787 MapConstPtr_Type map1,
5788 MapConstPtr_Type map2,
5789 MapConstPtr_Type map3,
5790 bool callFillComplete)
5793 DomainConstPtr_Type domain = domainVec_.at(FEloc);
5795 MapConstPtr_Type mapInt = domain->getGlobalInterfaceMapVecFieldUnique();
5796 MapConstPtr_Type mapOtherInt = domain->getOtherGlobalInterfaceMapVecFieldUnique();
5797 MapConstPtr_Type mapPartInt = domain->getGlobalInterfaceMapVecFieldPartial();
5798 MapConstPtr_Type mapOtherPartInt = domain->getOtherGlobalInterfaceMapVecFieldPartial();
5799 Teuchos::Array<SC> value( 1, 0. );
5801 Teuchos::Array<GO> indices( 1, 0 );
5804 if (mapPartInt.is_null()) {
5805 for(
int k = 0; k < mapInt->getNodeNumElements(); k++){
5806 dofRow = mapInt->getGlobalElement(k);
5807 indices[0] = mapOtherInt->getGlobalElement(k);
5808 C->insertGlobalValues(dofRow, indices(), value());
5812 for(
int k = 0; k < mapPartInt->getNodeNumElements(); k++){
5813 dofRow = mapPartInt->getGlobalElement(k);
5814 indices[0] = mapOtherPartInt->getGlobalElement(k);
5815 C->insertGlobalValues(dofRow, indices(), value());
5818 if (callFillComplete)
5821 C->fillComplete(map2, map3);
5826template <
class SC,
class LO,
class GO,
class NO>
5827void FE<SC,LO,GO,NO>::assemblyShapeDerivativeVelocity(
int dim,
5828 std::string FEType1,
5829 std::string FEType2,
5832 MultiVectorPtr_Type u,
5833 MultiVectorPtr_Type w,
5834 MultiVectorPtr_Type p,
5838 bool callFillComplete)
5842 DomainConstPtr_Type domain = domainVec_.at(FEloc);
5843 ElementsPtr_Type elements = domain->getElementsC();
5844 vec2D_dbl_ptr_Type pointsRep = domain->getPointsRepeated();
5845 MapConstPtr_Type map = domain->getMapRepeated();
5847 vec3D_dbl_ptr_Type dPhiU;
5848 vec2D_dbl_ptr_Type phiU;
5849 vec2D_dbl_ptr_Type phiP;
5850 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
5851 vec2D_dbl_ptr_Type quadPts;
5854 UN extraDeg = 2*Helper::determineDegree( dim, FEType1, Helper::Deriv1);
5855 UN deg = 2*Helper::determineDegree( dim, FEType1, Helper::Deriv0) + extraDeg;
5857 Helper::getDPhi(dPhiU, weights, dim, FEType1, deg);
5858 Helper::getPhi(phiU, weights, dim, FEType1, deg);
5859 Helper::getPhi(phiP, weights, dim, FEType2, deg);
5860 Helper::getQuadratureValues(dim, deg, quadPts, weights,FEType1);
5865 SmallMatrix<SC> B(dim);
5866 SmallMatrix<SC> Binv(dim);
5870 Teuchos::ArrayRCP< const SC > uArray = u->getData(0);
5871 Teuchos::ArrayRCP< const SC > wArray = w->getData(0);
5872 Teuchos::ArrayRCP< const SC > pArray = p->getData(0);
5876 double val11, val12, val21, val22;
5877 double valDK1_11, valDK1_12, valDK1_21, valDK1_22;
5878 double valDK2_11, valDK2_12, valDK2_21, valDK2_22;
5879 double valDN_11, valDN_12, valDN_21, valDN_22;
5880 double valDW_11, valDW_12, valDW_21, valDW_22;
5881 double valDP_11, valDP_12, valDP_21, valDP_22;
5882 double valDM_11, valDM_12, valDM_21, valDM_22;
5883 vec_dbl_Type p1(3,0.0), p2(3,0.0), p3(3,0.0);
5888 vec2D_dbl_Type u1Loc(1, vec_dbl_Type(weights->size(), -1.));
5889 vec2D_dbl_Type u2Loc(1, vec_dbl_Type(weights->size(), -1.));
5890 vec2D_dbl_Type w1Loc(1, vec_dbl_Type(weights->size(), -1.));
5891 vec2D_dbl_Type w2Loc(1, vec_dbl_Type(weights->size(), -1.));
5892 vec2D_dbl_Type pLoc(1, vec_dbl_Type(weights->size(), -1.));
5893 vec2D_dbl_Type u11(1, vec_dbl_Type(weights->size(), -1.));
5894 vec2D_dbl_Type u12(1, vec_dbl_Type(weights->size(), -1.));
5895 vec2D_dbl_Type u21(1, vec_dbl_Type(weights->size(), -1.));
5896 vec2D_dbl_Type u22(1, vec_dbl_Type(weights->size(), -1.));
5897 vec2D_dbl_Type w11(1, vec_dbl_Type(weights->size(), -1.));
5898 vec2D_dbl_Type w12(1, vec_dbl_Type(weights->size(), -1.));
5899 vec2D_dbl_Type w21(1, vec_dbl_Type(weights->size(), -1.));
5900 vec2D_dbl_Type w22(1, vec_dbl_Type(weights->size(), -1.));
5901 vec2D_dbl_Type sigma11(1, vec_dbl_Type(weights->size(), -1.));
5902 vec2D_dbl_Type sigma12(1, vec_dbl_Type(weights->size(), -1.));
5903 vec2D_dbl_Type sigma21(1, vec_dbl_Type(weights->size(), -1.));
5904 vec2D_dbl_Type sigma22(1, vec_dbl_Type(weights->size(), -1.));
5906 for (
int T = 0; T < elements->numberElements(); T++)
5908 p1 = pointsRep->at(elements->getElement(T).getNode(0));
5909 p2 = pointsRep->at(elements->getElement(T).getNode(1));
5910 p3 = pointsRep->at(elements->getElement(T).getNode(2));
5912 Helper::buildTransformation(elements->getElement(T).getVectorNodeList(), pointsRep, B,FEType1);
5913 detB = B.computeInverse(Binv);
5914 absDetB = std::fabs(detB);
5917 vec3D_dbl_Type dPhiTransU( dPhiU->size(), vec2D_dbl_Type( dPhiU->at(0).size(), vec_dbl_Type(dim,0.) ) );
5918 applyBTinv( dPhiU, dPhiTransU, Binv );
5921 for(
int k = 0; k < phiU->size(); k++)
5927 for(
int i = 0; i < phiU->at(0).size(); i++)
5929 LO index1 = dim * elements->getElement(T).getNode(i) + 0;
5930 LO index2 = dim * elements->getElement(T).getNode(i) + 1;
5931 u1Loc[0][k] += uArray[index1] * phiU->at(k).at(i);
5932 u2Loc[0][k] += uArray[index2] * phiU->at(k).at(i);
5933 w1Loc[0][k] += wArray[index1] * phiU->at(k).at(i);
5934 w2Loc[0][k] += wArray[index2] * phiU->at(k).at(i);
5941 for(
int k = 0; k < phiP->size(); k++)
5944 for(
int i = 0; i < phiP->at(0).size(); i++)
5948 LO index = elements->getElement(T).getNode(i) + 0;
5949 pLoc[0][k] += pArray[index] * phiP->at(k).at(i);
5956 for(
int k = 0; k < dPhiTransU.size(); k++)
5966 for(
int i = 0; i < dPhiTransU[0].size(); i++)
5968 LO index1 = dim * elements->getElement(T).getNode(i) + 0;
5969 LO index2 = dim * elements->getElement(T).getNode(i) + 1;
5970 u11[0][k] += uArray[index1] * dPhiTransU[k][i][0];
5971 u12[0][k] += uArray[index1] * dPhiTransU[k][i][1];
5972 u21[0][k] += uArray[index2] * dPhiTransU[k][i][0];
5973 u22[0][k] += uArray[index2] * dPhiTransU[k][i][1];
5974 w11[0][k] += wArray[index1] * dPhiTransU[k][i][0];
5975 w12[0][k] += wArray[index1] * dPhiTransU[k][i][1];
5976 w21[0][k] += wArray[index2] * dPhiTransU[k][i][0];
5977 w22[0][k] += wArray[index2] * dPhiTransU[k][i][1];
5984 for(
int k = 0; k < dPhiTransU.size(); k++)
5986 sigma11[0][k] = rho * nu * (u11[0][k] + u11[0][k]) - pLoc[0][k];
5987 sigma12[0][k] = rho * nu * (u12[0][k] + u21[0][k]);
5988 sigma21[0][k] = rho * nu * (u21[0][k] + u12[0][k]);
5989 sigma22[0][k] = rho * nu * (u22[0][k] + u22[0][k]) - pLoc[0][k];
5993 for (
int i = 0; i < dPhiU->at(0).size(); i++)
5995 Teuchos::Array<SC> value11( 1, 0. );
5996 Teuchos::Array<SC> value12( 1, 0. );
5997 Teuchos::Array<SC> value21( 1, 0. );
5998 Teuchos::Array<SC> value22( 1, 0. );
5999 Teuchos::Array<GO> indices( 1, 0 );
6001 for (
int j = 0; j < dPhiU->at(0).size(); j++)
6039 for (
int k = 0; k < dPhiU->size(); k++)
6042 valDK1_11 = valDK1_11 + weights->at(k) *
6043 ( 2 * u11[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][0] +
6044 u11[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][1] +
6045 u21[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][1] );
6046 valDK1_12 = valDK1_12 + weights->at(k) *
6047 ( 2 * u12[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][0] +
6048 u12[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][1] +
6049 u22[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][1] );
6050 valDK1_21 = valDK1_21 + weights->at(k) *
6051 ( u11[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][0] +
6052 u21[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][0] +
6053 2 * u21[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][1] );
6054 valDK1_22 = valDK1_22 + weights->at(k) *
6055 ( u12[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][0] +
6056 u22[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][0] +
6057 2 * u22[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][1] );
6060 valDK2_11 = valDK2_11 + weights->at(k) *
6061 ( -sigma12[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][0] +
6062 sigma12[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][1] );
6063 valDK2_12 = valDK2_12 + weights->at(k) *
6064 ( sigma11[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][0] +
6065 -sigma11[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][1] );
6066 valDK2_21 = valDK2_21 + weights->at(k) *
6067 ( -sigma22[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][0] +
6068 sigma22[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][1] );
6069 valDK2_22 = valDK2_22 + weights->at(k) *
6070 ( sigma21[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][0] +
6071 -sigma21[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][1] );
6074 valDN_11 = valDN_11 + weights->at(k) *
6075 ( -(u2Loc[0][k] - w2Loc[0][k]) * dPhiTransU[k][j][1] * u11[0][k] * phiU->at(k).at(i) +
6076 (u2Loc[0][k] - w2Loc[0][k]) * dPhiTransU[k][j][0] * u12[0][k] * phiU->at(k).at(i) );
6077 valDN_12 = valDN_12 + weights->at(k) *
6078 ( (u1Loc[0][k] - w1Loc[0][k]) * dPhiTransU[k][j][1] * u11[0][k] * phiU->at(k).at(i) -
6079 (u1Loc[0][k] - w1Loc[0][k]) * dPhiTransU[k][j][0] * u12[0][k] * phiU->at(k).at(i) );
6080 valDN_21 = valDN_21 + weights->at(k) *
6081 ( -(u2Loc[0][k] - w2Loc[0][k]) * dPhiTransU[k][j][1] * u21[0][k] * phiU->at(k).at(i) +
6082 (u2Loc[0][k] - w2Loc[0][k]) * dPhiTransU[k][j][0] * u22[0][k] * phiU->at(k).at(i) );
6083 valDN_22 = valDN_22 + weights->at(k) *
6084 ( (u1Loc[0][k] - w1Loc[0][k]) * dPhiTransU[k][j][1] * u21[0][k] * phiU->at(k).at(i) -
6085 (u1Loc[0][k] - w1Loc[0][k]) * dPhiTransU[k][j][0] * u22[0][k] * phiU->at(k).at(i) );
6088 valDW_11 = valDW_11 + weights->at(k) *
6089 ( u11[0][k] * phiU->at(k).at(j) * phiU->at(k).at(i) );
6090 valDW_12 = valDW_12 + weights->at(k) *
6091 ( u12[0][k] * phiU->at(k).at(j) * phiU->at(k).at(i) );
6092 valDW_21 = valDW_21 + weights->at(k) *
6093 ( u21[0][k] * phiU->at(k).at(j) * phiU->at(k).at(i) );
6094 valDW_22 = valDW_22 + weights->at(k) *
6095 ( u22[0][k] * phiU->at(k).at(j) * phiU->at(k).at(i) );
6098 valDP_11 = valDP_11 + weights->at(k) *
6099 ( ( -w21[0][k] * dPhiTransU[k][j][1] + w22[0][k] * dPhiTransU[k][j][0] ) * u1Loc[0][k] * phiU->at(k).at(i) );
6100 valDP_12 = valDP_12 + weights->at(k) *
6101 ( ( w11[0][k] * dPhiTransU[k][j][1] - w12[0][k] * dPhiTransU[k][j][0] ) * u1Loc[0][k] * phiU->at(k).at(i) );
6102 valDP_21 = valDP_21 + weights->at(k) *
6103 ( ( -w21[0][k] * dPhiTransU[k][j][1] + w22[0][k] * dPhiTransU[k][j][0] ) * u2Loc[0][k] * phiU->at(k).at(i) );
6104 valDP_22 = valDP_22 + weights->at(k) *
6105 ( ( w11[0][k] * dPhiTransU[k][j][1] - w12[0][k] * dPhiTransU[k][j][0] ) * u2Loc[0][k] * phiU->at(k).at(i) );
6108 valDM_11 = valDM_11 + weights->at(k) *
6109 ( dPhiTransU[k][j][0] * u1Loc[0][k] * phiU->at(k).at(i) );
6110 valDM_12 = valDM_12 + weights->at(k) *
6111 ( dPhiTransU[k][j][1] * u1Loc[0][k] * phiU->at(k).at(i) );
6112 valDM_21 = valDM_21 + weights->at(k) *
6113 ( dPhiTransU[k][j][0] * u2Loc[0][k] * phiU->at(k).at(i) );
6114 valDM_22 = valDM_22 + weights->at(k) *
6115 ( dPhiTransU[k][j][1] * u2Loc[0][k] * phiU->at(k).at(i) );
6118 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;
6119 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;
6120 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;
6121 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;
6123 val11 = absDetB * val11;
6124 val12 = absDetB * val12;
6125 val21 = absDetB * val21;
6126 val22 = absDetB * val22;
6133 glob_j = dim * map->getGlobalElement(elements->getElement(T).getNode(j));
6134 glob_i = dim * map->getGlobalElement(elements->getElement(T).getNode(i));
6135 indices[0] = glob_j;
6137 D->insertGlobalValues(glob_i, indices(), value11());
6138 D->insertGlobalValues(glob_i+1, indices(), value21());
6140 indices[0] = glob_j;
6141 D->insertGlobalValues(glob_i, indices(), value12());
6142 D->insertGlobalValues(glob_i+1, indices(), value22());
6146 if (callFillComplete)
6153 double val11, val12, val13, val21, val22, val23, val31, val32, val33;
6154 double valDK1_11, valDK1_12, valDK1_13, valDK1_21, valDK1_22, valDK1_23, valDK1_31, valDK1_32, valDK1_33;
6155 double valDK2_11, valDK2_12, valDK2_13, valDK2_21, valDK2_22, valDK2_23, valDK2_31, valDK2_32, valDK2_33;
6156 double valDN_11, valDN_12, valDN_13, valDN_21, valDN_22, valDN_23, valDN_31, valDN_32, valDN_33;
6157 double valDW_11, valDW_12, valDW_13, valDW_21, valDW_22, valDW_23, valDW_31, valDW_32, valDW_33;
6158 double valDP_11, valDP_12, valDP_13, valDP_21, valDP_22, valDP_23, valDP_31, valDP_32, valDP_33;
6159 double valDM_11, valDM_12, valDM_13, valDM_21, valDM_22, valDM_23, valDM_31, valDM_32, valDM_33;
6160 vec_dbl_Type p1(3,0.0), p2(3,0.0), p3(3,0.0), p4(3,0.0);
6165 vec2D_dbl_Type u1Loc(1, vec_dbl_Type(weights->size(), -1.));
6166 vec2D_dbl_Type u2Loc(1, vec_dbl_Type(weights->size(), -1.));
6167 vec2D_dbl_Type u3Loc(1, vec_dbl_Type(weights->size(), -1.));
6168 vec2D_dbl_Type w1Loc(1, vec_dbl_Type(weights->size(), -1.));
6169 vec2D_dbl_Type w2Loc(1, vec_dbl_Type(weights->size(), -1.));
6170 vec2D_dbl_Type w3Loc(1, vec_dbl_Type(weights->size(), -1.));
6171 vec2D_dbl_Type pLoc(1, vec_dbl_Type(weights->size(), -1.));
6172 vec2D_dbl_Type u11(1, vec_dbl_Type(weights->size(), -1.));
6173 vec2D_dbl_Type u12(1, vec_dbl_Type(weights->size(), -1.));
6174 vec2D_dbl_Type u13(1, vec_dbl_Type(weights->size(), -1.));
6175 vec2D_dbl_Type u21(1, vec_dbl_Type(weights->size(), -1.));
6176 vec2D_dbl_Type u22(1, vec_dbl_Type(weights->size(), -1.));
6177 vec2D_dbl_Type u23(1, vec_dbl_Type(weights->size(), -1.));
6178 vec2D_dbl_Type u31(1, vec_dbl_Type(weights->size(), -1.));
6179 vec2D_dbl_Type u32(1, vec_dbl_Type(weights->size(), -1.));
6180 vec2D_dbl_Type u33(1, vec_dbl_Type(weights->size(), -1.));
6181 vec2D_dbl_Type w11(1, vec_dbl_Type(weights->size(), -1.));
6182 vec2D_dbl_Type w12(1, vec_dbl_Type(weights->size(), -1.));
6183 vec2D_dbl_Type w13(1, vec_dbl_Type(weights->size(), -1.));
6184 vec2D_dbl_Type w21(1, vec_dbl_Type(weights->size(), -1.));
6185 vec2D_dbl_Type w22(1, vec_dbl_Type(weights->size(), -1.));
6186 vec2D_dbl_Type w23(1, vec_dbl_Type(weights->size(), -1.));
6187 vec2D_dbl_Type w31(1, vec_dbl_Type(weights->size(), -1.));
6188 vec2D_dbl_Type w32(1, vec_dbl_Type(weights->size(), -1.));
6189 vec2D_dbl_Type w33(1, vec_dbl_Type(weights->size(), -1.));
6190 vec2D_dbl_Type sigma11(1, vec_dbl_Type(weights->size(), -1.));
6191 vec2D_dbl_Type sigma12(1, vec_dbl_Type(weights->size(), -1.));
6192 vec2D_dbl_Type sigma13(1, vec_dbl_Type(weights->size(), -1.));
6193 vec2D_dbl_Type sigma21(1, vec_dbl_Type(weights->size(), -1.));
6194 vec2D_dbl_Type sigma22(1, vec_dbl_Type(weights->size(), -1.));
6195 vec2D_dbl_Type sigma23(1, vec_dbl_Type(weights->size(), -1.));
6196 vec2D_dbl_Type sigma31(1, vec_dbl_Type(weights->size(), -1.));
6197 vec2D_dbl_Type sigma32(1, vec_dbl_Type(weights->size(), -1.));
6198 vec2D_dbl_Type sigma33(1, vec_dbl_Type(weights->size(), -1.));
6200 for (
int T = 0; T < elements->numberElements(); T++)
6202 p1 = pointsRep->at(elements->getElement(T).getNode(0));
6203 p2 = pointsRep->at(elements->getElement(T).getNode(1));
6204 p3 = pointsRep->at(elements->getElement(T).getNode(2));
6205 p4 = pointsRep->at(elements->getElement(T).getNode(3));
6207 Helper::buildTransformation(elements->getElement(T).getVectorNodeList(), pointsRep, B,FEType1);
6208 detB = B.computeInverse(Binv);
6209 absDetB = std::fabs(detB);
6212 vec3D_dbl_Type dPhiTransU( dPhiU->size(), vec2D_dbl_Type( dPhiU->at(0).size(), vec_dbl_Type(dim,0.) ) );
6213 applyBTinv( dPhiU, dPhiTransU, Binv );
6216 for(
int k = 0; k < phiU->size(); k++)
6224 for(
int i = 0; i < phiU->at(0).size(); i++)
6226 LO index1 = dim * elements->getElement(T).getNode(i) + 0;
6227 LO index2 = dim * elements->getElement(T).getNode(i) + 1;
6228 LO index3 = dim * elements->getElement(T).getNode(i) + 2;
6229 u1Loc[0][k] += uArray[index1] * phiU->at(k).at(i);
6230 u2Loc[0][k] += uArray[index2] * phiU->at(k).at(i);
6231 u3Loc[0][k] += uArray[index3] * phiU->at(k).at(i);
6232 w1Loc[0][k] += wArray[index1] * phiU->at(k).at(i);
6233 w2Loc[0][k] += wArray[index2] * phiU->at(k).at(i);
6234 w3Loc[0][k] += wArray[index3] * phiU->at(k).at(i);
6240 for(
int k = 0; k < phiP->size(); k++)
6243 for(
int i = 0; i < phiP->at(0).size(); i++)
6246 LO index = elements->getElement(T).getNode(i) + 0;
6247 pLoc[0][k] += pArray[index] * phiP->at(k).at(i);
6253 for(
int k = 0; k < dPhiTransU.size(); k++)
6273 for(
int i = 0; i < dPhiTransU[0].size(); i++)
6275 LO index1 = dim * elements->getElement(T).getNode(i) + 0;
6276 LO index2 = dim * elements->getElement(T).getNode(i) + 1;
6277 LO index3 = dim * elements->getElement(T).getNode(i) + 2;
6278 u11[0][k] += uArray[index1] * dPhiTransU[k][i][0];
6279 u12[0][k] += uArray[index1] * dPhiTransU[k][i][1];
6280 u13[0][k] += uArray[index1] * dPhiTransU[k][i][2];
6281 u21[0][k] += uArray[index2] * dPhiTransU[k][i][0];
6282 u22[0][k] += uArray[index2] * dPhiTransU[k][i][1];
6283 u23[0][k] += uArray[index2] * dPhiTransU[k][i][2];
6284 u31[0][k] += uArray[index3] * dPhiTransU[k][i][0];
6285 u32[0][k] += uArray[index3] * dPhiTransU[k][i][1];
6286 u33[0][k] += uArray[index3] * dPhiTransU[k][i][2];
6287 w11[0][k] += wArray[index1] * dPhiTransU[k][i][0];
6288 w12[0][k] += wArray[index1] * dPhiTransU[k][i][1];
6289 w13[0][k] += wArray[index1] * dPhiTransU[k][i][2];
6290 w21[0][k] += wArray[index2] * dPhiTransU[k][i][0];
6291 w22[0][k] += wArray[index2] * dPhiTransU[k][i][1];
6292 w23[0][k] += wArray[index2] * dPhiTransU[k][i][2];
6293 w31[0][k] += wArray[index3] * dPhiTransU[k][i][0];
6294 w32[0][k] += wArray[index3] * dPhiTransU[k][i][1];
6295 w33[0][k] += wArray[index3] * dPhiTransU[k][i][2];
6301 for(
int k = 0; k < dPhiTransU.size(); k++)
6303 sigma11[0][k] = rho * nu * (u11[0][k] + u11[0][k]) - pLoc[0][k];
6304 sigma12[0][k] = rho * nu * (u12[0][k] + u21[0][k]);
6305 sigma13[0][k] = rho * nu * (u13[0][k] + u31[0][k]);
6306 sigma21[0][k] = rho * nu * (u21[0][k] + u12[0][k]);
6307 sigma22[0][k] = rho * nu * (u22[0][k] + u22[0][k]) - pLoc[0][k];
6308 sigma23[0][k] = rho * nu * (u23[0][k] + u32[0][k]);
6309 sigma31[0][k] = rho * nu * (u31[0][k] + u13[0][k]);
6310 sigma32[0][k] = rho * nu * (u32[0][k] + u23[0][k]);
6311 sigma33[0][k] = rho * nu * (u33[0][k] + u33[0][k]) - pLoc[0][k];
6315 for (
int i = 0; i < dPhiU->at(0).size(); i++)
6317 Teuchos::Array<SC> value11( 1, 0. );
6318 Teuchos::Array<SC> value12( 1, 0. );
6319 Teuchos::Array<SC> value13( 1, 0. );
6320 Teuchos::Array<SC> value21( 1, 0. );
6321 Teuchos::Array<SC> value22( 1, 0. );
6322 Teuchos::Array<SC> value23( 1, 0. );
6323 Teuchos::Array<SC> value31( 1, 0. );
6324 Teuchos::Array<SC> value32( 1, 0. );
6325 Teuchos::Array<SC> value33( 1, 0. );
6326 Teuchos::Array<GO> indices( 1, 0 );
6328 for (
int j = 0; j < dPhiU->at(0).size(); j++)
6396 for (
int k = 0; k < dPhiU->size(); k++)
6399 valDK1_11 = valDK1_11 + weights->at(k) *
6400 ( 2 * u11[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][0] +
6401 ( u11[0][k] * dPhiTransU[k][j][1] + u21[0][k] * dPhiTransU[k][j][0] ) * dPhiTransU[k][i][1] +
6402 ( u11[0][k] * dPhiTransU[k][j][2] + u31[0][k] * dPhiTransU[k][j][0] ) * dPhiTransU[k][i][2] );
6403 valDK1_12 = valDK1_12 + weights->at(k) *
6404 ( 2 * u12[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][0] +
6405 ( u12[0][k] * dPhiTransU[k][j][1] + u22[0][k] * dPhiTransU[k][j][0] ) * dPhiTransU[k][i][1] +
6406 ( u12[0][k] * dPhiTransU[k][j][2] + u32[0][k] * dPhiTransU[k][j][0] ) * dPhiTransU[k][i][2] );
6407 valDK1_13 = valDK1_13 + weights->at(k) *
6408 ( 2 * u13[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][0] +
6409 ( u13[0][k] * dPhiTransU[k][j][1] + u23[0][k] * dPhiTransU[k][j][0] ) * dPhiTransU[k][i][1] +
6410 ( u13[0][k] * dPhiTransU[k][j][2] + u33[0][k] * dPhiTransU[k][j][0] ) * dPhiTransU[k][i][2] );
6411 valDK1_21 = valDK1_21 + weights->at(k) *
6412 ( ( u21[0][k] * dPhiTransU[k][j][0] + u11[0][k] * dPhiTransU[k][j][1] ) * dPhiTransU[k][i][0] +
6413 2 * u21[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][1] +
6414 ( u21[0][k] * dPhiTransU[k][j][2] + u31[0][k] * dPhiTransU[k][j][1] ) * dPhiTransU[k][i][2] );
6415 valDK1_22 = valDK1_22 + weights->at(k) *
6416 ( ( u22[0][k] * dPhiTransU[k][j][0] + u12[0][k] * dPhiTransU[k][j][1] ) * dPhiTransU[k][i][0] +
6417 2 * u22[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][1] +
6418 ( u22[0][k] * dPhiTransU[k][j][2] + u32[0][k] * dPhiTransU[k][j][1] ) * dPhiTransU[k][i][2] );
6419 valDK1_23 = valDK1_23 + weights->at(k) *
6420 ( ( u23[0][k] * dPhiTransU[k][j][0] + u13[0][k] * dPhiTransU[k][j][1] ) * dPhiTransU[k][i][0] +
6421 2 * u23[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][1] +
6422 ( u23[0][k] * dPhiTransU[k][j][2] + u33[0][k] * dPhiTransU[k][j][1] ) * dPhiTransU[k][i][2] );
6423 valDK1_31 = valDK1_31 + weights->at(k) *
6424 ( ( u31[0][k] * dPhiTransU[k][j][0] + u11[0][k] * dPhiTransU[k][j][2] ) * dPhiTransU[k][i][0] +
6425 ( u31[0][k] * dPhiTransU[k][j][1] + u21[0][k] * dPhiTransU[k][j][2] ) * dPhiTransU[k][i][1] ) +
6426 2 * u31[0][k] * dPhiTransU[k][j][2] * dPhiTransU[k][i][2];
6427 valDK1_32 = valDK1_32 + weights->at(k) *
6428 ( ( u32[0][k] * dPhiTransU[k][j][0] + u12[0][k] * dPhiTransU[k][j][2] ) * dPhiTransU[k][i][0] +
6429 ( u32[0][k] * dPhiTransU[k][j][1] + u22[0][k] * dPhiTransU[k][j][2] ) * dPhiTransU[k][i][1] ) +
6430 2 * u32[0][k] * dPhiTransU[k][j][2] * dPhiTransU[k][i][2];
6431 valDK1_33 = valDK1_33 + weights->at(k) *
6432 ( ( u33[0][k] * dPhiTransU[k][j][0] + u13[0][k] * dPhiTransU[k][j][2] ) * dPhiTransU[k][i][0] +
6433 ( u33[0][k] * dPhiTransU[k][j][1] + u23[0][k] * dPhiTransU[k][j][2] ) * dPhiTransU[k][i][1] ) +
6434 2 * u33[0][k] * dPhiTransU[k][j][2] * dPhiTransU[k][i][2];
6437 valDK2_11 = valDK2_11 + weights->at(k) *
6438 ( ( -sigma12[0][k] * dPhiTransU[k][j][1] - sigma13[0][k] * dPhiTransU[k][j][2] ) * dPhiTransU[k][i][0] +
6439 sigma12[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][1] +
6440 sigma13[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][2] );
6441 valDK2_12 = valDK2_12 + weights->at(k) *
6442 ( sigma11[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][0] +
6443 ( -sigma11[0][k] * dPhiTransU[k][j][0] - sigma13[0][k] * dPhiTransU[k][j][2] ) * dPhiTransU[k][i][1] +
6444 sigma13[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][2] );
6445 valDK2_13 = valDK2_13 + weights->at(k) *
6446 ( sigma11[0][k] * dPhiTransU[k][j][2] * dPhiTransU[k][i][0] +
6447 sigma12[0][k] * dPhiTransU[k][j][2] * dPhiTransU[k][i][1] +
6448 ( -sigma11[0][k] * dPhiTransU[k][j][0] - sigma12[0][k] * dPhiTransU[k][j][1] ) * dPhiTransU[k][i][2] );
6449 valDK2_21 = valDK2_21 + weights->at(k) *
6450 ( ( -sigma22[0][k] * dPhiTransU[k][j][1] - sigma23[0][k] * dPhiTransU[k][j][2] ) * dPhiTransU[k][i][0] +
6451 sigma22[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][1] +
6452 sigma23[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][2] );
6453 valDK2_22 = valDK2_22 + weights->at(k) *
6454 ( sigma21[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][0] +
6455 ( -sigma21[0][k] * dPhiTransU[k][j][0] - sigma23[0][k] * dPhiTransU[k][j][2] ) * dPhiTransU[k][i][1] +
6456 sigma23[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][2] );
6457 valDK2_23 = valDK2_23 + weights->at(k) *
6458 ( sigma21[0][k] * dPhiTransU[k][j][2] * dPhiTransU[k][i][0] +
6459 sigma22[0][k] * dPhiTransU[k][j][2] * dPhiTransU[k][i][1] +
6460 ( -sigma21[0][k] * dPhiTransU[k][j][0] - sigma22[0][k] * dPhiTransU[k][j][1] ) * dPhiTransU[k][i][2] );
6461 valDK2_31 = valDK2_31 + weights->at(k) *
6462 ( ( -sigma32[0][k] * dPhiTransU[k][j][1] - sigma33[0][k] * dPhiTransU[k][j][2] ) * dPhiTransU[k][i][0] +
6463 sigma32[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][1] +
6464 sigma33[0][k] * dPhiTransU[k][j][0] * dPhiTransU[k][i][2] );
6465 valDK2_32 = valDK2_32 + weights->at(k) *
6466 ( sigma31[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][0] +
6467 ( -sigma31[0][k] * dPhiTransU[k][j][0] - sigma33[0][k] * dPhiTransU[k][j][2] ) * dPhiTransU[k][i][1] +
6468 sigma33[0][k] * dPhiTransU[k][j][1] * dPhiTransU[k][i][2] );
6469 valDK2_33 = valDK2_33 + weights->at(k) *
6470 ( sigma31[0][k] * dPhiTransU[k][j][2] * dPhiTransU[k][i][0] +
6471 sigma32[0][k] * dPhiTransU[k][j][2] * dPhiTransU[k][i][1] +
6472 ( -sigma31[0][k] * dPhiTransU[k][j][0] - sigma32[0][k] * dPhiTransU[k][j][1] ) * dPhiTransU[k][i][2] );
6484 ZN_11 = - ( u2Loc[0][k] - w2Loc[0][k] ) * dPhiTransU[k][j][1] - ( u3Loc[0][k] - w3Loc[0][k] ) * dPhiTransU[k][j][2];
6485 ZN_12 = ( u2Loc[0][k] - w2Loc[0][k] ) * dPhiTransU[k][j][0];
6486 ZN_13 = ( u3Loc[0][k] - w3Loc[0][k] ) * dPhiTransU[k][j][0];
6487 ZN_21 = ( u1Loc[0][k] - w1Loc[0][k] ) * dPhiTransU[k][j][1];
6488 ZN_22 = - ( u1Loc[0][k] - w1Loc[0][k] ) * dPhiTransU[k][j][0] - ( u3Loc[0][k] - w3Loc[0][k] ) * dPhiTransU[k][j][2];
6489 ZN_23 = ( u3Loc[0][k] - w3Loc[0][k] ) * dPhiTransU[k][j][1];
6490 ZN_31 = ( u1Loc[0][k] - w1Loc[0][k] ) * dPhiTransU[k][j][2];
6491 ZN_32 = ( u2Loc[0][k] - w2Loc[0][k] ) * dPhiTransU[k][j][2];
6492 ZN_33 = - ( u1Loc[0][k] - w1Loc[0][k] ) * dPhiTransU[k][j][0] - ( u2Loc[0][k] - w2Loc[0][k] ) * dPhiTransU[k][j][1];
6494 valDN_11 = valDN_11 + weights->at(k) *
6495 ( ZN_11 * u11[0][k] * phiU->at(k).at(i) +
6496 ZN_12 * u12[0][k] * phiU->at(k).at(i) +
6497 ZN_13 * u13[0][k] * phiU->at(k).at(i) );
6498 valDN_12 = valDN_12 + weights->at(k) *
6499 ( ZN_21 * u11[0][k] * phiU->at(k).at(i) +
6500 ZN_22 * u12[0][k] * phiU->at(k).at(i) +
6501 ZN_23 * u13[0][k] * phiU->at(k).at(i) );
6502 valDN_13 = valDN_13 + weights->at(k) *
6503 ( ZN_31 * u11[0][k] * phiU->at(k).at(i) +
6504 ZN_32 * u12[0][k] * phiU->at(k).at(i) +
6505 ZN_33 * u13[0][k] * phiU->at(k).at(i) );
6506 valDN_21 = valDN_21 + weights->at(k) *
6507 ( ZN_11 * u21[0][k] * phiU->at(k).at(i) +
6508 ZN_12 * u22[0][k] * phiU->at(k).at(i) +
6509 ZN_13 * u23[0][k] * phiU->at(k).at(i) );
6510 valDN_22 = valDN_22 + weights->at(k) *
6511 ( ZN_21 * u21[0][k] * phiU->at(k).at(i) +
6512 ZN_22 * u22[0][k] * phiU->at(k).at(i) +
6513 ZN_23 * u23[0][k] * phiU->at(k).at(i) );
6514 valDN_23 = valDN_23 + weights->at(k) *
6515 ( ZN_31 * u21[0][k] * phiU->at(k).at(i) +
6516 ZN_32 * u22[0][k] * phiU->at(k).at(i) +
6517 ZN_33 * u23[0][k] * phiU->at(k).at(i) );
6518 valDN_31 = valDN_31 + weights->at(k) *
6519 ( ZN_11 * u31[0][k] * phiU->at(k).at(i) +
6520 ZN_12 * u32[0][k] * phiU->at(k).at(i) +
6521 ZN_13 * u33[0][k] * phiU->at(k).at(i) );
6522 valDN_32 = valDN_32 + weights->at(k) *
6523 ( ZN_21 * u31[0][k] * phiU->at(k).at(i) +
6524 ZN_22 * u32[0][k] * phiU->at(k).at(i) +
6525 ZN_23 * u33[0][k] * phiU->at(k).at(i) );
6526 valDN_33 = valDN_33 + weights->at(k) *
6527 ( ZN_31 * u31[0][k] * phiU->at(k).at(i) +
6528 ZN_32 * u32[0][k] * phiU->at(k).at(i) +
6529 ZN_33 * u33[0][k] * phiU->at(k).at(i) );
6532 valDW_11 = valDW_11 + weights->at(k) *
6533 ( u11[0][k] * phiU->at(k).at(j) * phiU->at(k).at(i) );
6534 valDW_12 = valDW_12 + weights->at(k) *
6535 ( u12[0][k] * phiU->at(k).at(j) * phiU->at(k).at(i) );
6536 valDW_13 = valDW_13 + weights->at(k) *
6537 ( u13[0][k] * phiU->at(k).at(j) * phiU->at(k).at(i) );
6538 valDW_21 = valDW_21 + weights->at(k) *
6539 ( u21[0][k] * phiU->at(k).at(j) * phiU->at(k).at(i) );
6540 valDW_22 = valDW_22 + weights->at(k) *
6541 ( u22[0][k] * phiU->at(k).at(j) * phiU->at(k).at(i) );
6542 valDW_23 = valDW_23 + weights->at(k) *
6543 ( u23[0][k] * phiU->at(k).at(j) * phiU->at(k).at(i) );
6544 valDW_31 = valDW_31 + weights->at(k) *
6545 ( u31[0][k] * phiU->at(k).at(j) * phiU->at(k).at(i) );
6546 valDW_32 = valDW_32 + weights->at(k) *
6547 ( u32[0][k] * phiU->at(k).at(j) * phiU->at(k).at(i) );
6548 valDW_33 = valDW_33 + weights->at(k) *
6549 ( u33[0][k] * phiU->at(k).at(j) * phiU->at(k).at(i) );
6555 ZP_1 = -w21[0][k] * dPhiTransU[k][j][1] + w22[0][k] * dPhiTransU[k][j][0] -
6556 w31[0][k] * dPhiTransU[k][j][2] + w33[0][k] * dPhiTransU[k][j][0];
6557 ZP_2 = w11[0][k] * dPhiTransU[k][j][1] - w12[0][k] * dPhiTransU[k][j][0] -
6558 w32[0][k] * dPhiTransU[k][j][2] + w33[0][k] * dPhiTransU[k][j][1];
6559 ZP_3 = w11[0][k] * dPhiTransU[k][j][2] - w13[0][k] * dPhiTransU[k][j][0] +
6560 w22[0][k] * dPhiTransU[k][j][2] - w23[0][k] * dPhiTransU[k][j][1];
6562 valDP_11 = valDP_11 + weights->at(k) *
6563 ( ZP_1 * u1Loc[0][k] * phiU->at(k).at(i) );
6564 valDP_12 = valDP_12 + weights->at(k) *
6565 ( ZP_2 * u1Loc[0][k] * phiU->at(k).at(i) );
6566 valDP_13 = valDP_13 + weights->at(k) *
6567 ( ZP_3 * u1Loc[0][k] * phiU->at(k).at(i) );
6568 valDP_21 = valDP_21 + weights->at(k) *
6569 ( ZP_1 * u2Loc[0][k] * phiU->at(k).at(i) );
6570 valDP_22 = valDP_22 + weights->at(k) *
6571 ( ZP_2 * u2Loc[0][k] * phiU->at(k).at(i) );
6572 valDP_23 = valDP_23 + weights->at(k) *
6573 ( ZP_3 * u2Loc[0][k] * phiU->at(k).at(i) );
6574 valDP_31 = valDP_31 + weights->at(k) *
6575 ( ZP_1 * u3Loc[0][k] * phiU->at(k).at(i) );
6576 valDP_32 = valDP_32 + weights->at(k) *
6577 ( ZP_2 * u3Loc[0][k] * phiU->at(k).at(i) );
6578 valDP_33 = valDP_33 + weights->at(k) *
6579 ( ZP_3 * u3Loc[0][k] * phiU->at(k).at(i) );
6582 valDM_11 = valDM_11 + weights->at(k) *
6583 ( dPhiTransU[k][j][0] * u1Loc[0][k] * phiU->at(k).at(i) );
6584 valDM_12 = valDM_12 + weights->at(k) *
6585 ( dPhiTransU[k][j][1] * u1Loc[0][k] * phiU->at(k).at(i) );
6586 valDM_13 = valDM_13 + weights->at(k) *
6587 ( dPhiTransU[k][j][2] * u1Loc[0][k] * phiU->at(k).at(i) );
6588 valDM_21 = valDM_21 + weights->at(k) *
6589 ( dPhiTransU[k][j][0] * u2Loc[0][k] * phiU->at(k).at(i) );
6590 valDM_22 = valDM_22 + weights->at(k) *
6591 ( dPhiTransU[k][j][1] * u2Loc[0][k] * phiU->at(k).at(i) );
6592 valDM_23 = valDM_23 + weights->at(k) *
6593 ( dPhiTransU[k][j][2] * u2Loc[0][k] * phiU->at(k).at(i) );
6594 valDM_31 = valDM_31 + weights->at(k) *
6595 ( dPhiTransU[k][j][0] * u3Loc[0][k] * phiU->at(k).at(i) );
6596 valDM_32 = valDM_32 + weights->at(k) *
6597 ( dPhiTransU[k][j][1] * u3Loc[0][k] * phiU->at(k).at(i) );
6598 valDM_33 = valDM_33 + weights->at(k) *
6599 ( dPhiTransU[k][j][2] * u3Loc[0][k] * phiU->at(k).at(i) );
6602 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;
6603 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;
6604 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;
6605 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;
6606 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;
6607 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;
6608 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;
6609 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;
6610 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;
6612 val11 = absDetB * val11;
6613 val12 = absDetB * val12;
6614 val13 = absDetB * val13;
6615 val21 = absDetB * val21;
6616 val22 = absDetB * val22;
6617 val23 = absDetB * val23;
6618 val31 = absDetB * val31;
6619 val32 = absDetB * val32;
6620 val33 = absDetB * val33;
6633 glob_j = dim * map->getGlobalElement(elements->getElement(T).getNode(j));
6634 glob_i = dim * map->getGlobalElement(elements->getElement(T).getNode(i));
6635 indices[0] = glob_j;
6637 D->insertGlobalValues(glob_i, indices(), value11());
6638 D->insertGlobalValues(glob_i+1, indices(), value21());
6639 D->insertGlobalValues(glob_i+2, indices(), value31());
6641 indices[0] = glob_j;
6642 D->insertGlobalValues(glob_i, indices(), value12());
6643 D->insertGlobalValues(glob_i+1, indices(), value22());
6644 D->insertGlobalValues(glob_i+2, indices(), value32());
6646 indices[0] = glob_j;
6647 D->insertGlobalValues(glob_i, indices(), value13());
6648 D->insertGlobalValues(glob_i+1, indices(), value23());
6649 D->insertGlobalValues(glob_i+2, indices(), value33());
6653 if (callFillComplete)
6662template <
class SC,
class LO,
class GO,
class NO>
6663void FE<SC,LO,GO,NO>::assemblyShapeDerivativeDivergence(
int dim,
6664 std::string FEType1,
6665 std::string FEType2,
6669 MapConstPtr_Type map1_unique,
6670 MapConstPtr_Type map2_unique,
6671 MultiVectorPtr_Type u,
6672 bool callFillComplete)
6674 DomainConstPtr_Type domain1 = domainVec_.at(FEloc1);
6675 ElementsPtr_Type elements = domain1->getElementsC();
6676 vec2D_dbl_ptr_Type pointsRep = domain1->getPointsRepeated();
6677 MapConstPtr_Type map1_rep = domain1->getMapRepeated();
6680 DomainConstPtr_Type domain2 = domainVec_.at(FEloc2);
6681 MapConstPtr_Type map2_rep = domain2->getMapRepeated();
6682 ElementsPtr_Type elements2 = domain2->getElementsC();
6684 vec3D_dbl_ptr_Type dPhiU;
6685 vec2D_dbl_ptr_Type phiU;
6686 vec2D_dbl_ptr_Type phiP;
6687 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
6688 vec2D_dbl_ptr_Type quadPts;
6690 UN extraDeg = Helper::determineDegree( dim, FEType1, Helper::Deriv1);
6691 UN deg = Helper::determineDegree( dim, FEType1, Helper::Deriv0) + 2*extraDeg;
6694 Helper::getDPhi(dPhiU, weights, dim, FEType1, deg);
6695 Helper::getPhi(phiU, weights, dim, FEType1, deg);
6696 Helper::getPhi(phiP, weights, dim, FEType2, deg);
6697 Helper::getQuadratureValues(dim, deg, quadPts, weights, FEType1);
6702 SmallMatrix<SC> B(dim);
6703 SmallMatrix<SC> Binv(dim);
6707 Teuchos::ArrayRCP< const SC > uArray = u->getData(0);
6712 double valDB_1, valDB_2;
6713 vec_dbl_Type p1(3,0.0), p2(3,0.0), p3(3,0.0);
6718 vec2D_dbl_Type u11(1, vec_dbl_Type(weights->size(), -1.));
6719 vec2D_dbl_Type u12(1, vec_dbl_Type(weights->size(), -1.));
6720 vec2D_dbl_Type u21(1, vec_dbl_Type(weights->size(), -1.));
6721 vec2D_dbl_Type u22(1, vec_dbl_Type(weights->size(), -1.));
6723 for (
int T = 0; T < elements->numberElements(); T++)
6725 p1 = pointsRep->at(elements->getElement(T).getNode(0));
6726 p2 = pointsRep->at(elements->getElement(T).getNode(1));
6727 p3 = pointsRep->at(elements->getElement(T).getNode(2));
6729 Helper::buildTransformation(elements->getElement(T).getVectorNodeList(), pointsRep, B,FEType1);
6730 detB = B.computeInverse(Binv);
6731 absDetB = std::fabs(detB);
6734 vec3D_dbl_Type dPhiTransU( dPhiU->size(), vec2D_dbl_Type( dPhiU->at(0).size(), vec_dbl_Type(dim,0.) ) );
6735 applyBTinv( dPhiU, dPhiTransU, Binv );
6739 for(
int k = 0; k < dPhiTransU.size(); k++)
6745 for(
int i = 0; i < dPhiTransU[0].size(); i++)
6747 LO index1 = dim * elements2->getElement(T).getNode(i) + 0;
6748 LO index2 = dim * elements2->getElement(T).getNode(i) + 1;
6749 u11[0][k] += uArray[index1] * dPhiTransU[k][i][0];
6750 u12[0][k] += uArray[index1] * dPhiTransU[k][i][1];
6751 u21[0][k] += uArray[index2] * dPhiTransU[k][i][0];
6752 u22[0][k] += uArray[index2] * dPhiTransU[k][i][1];
6757 for (
int i = 0; i < phiP->at(0).size(); i++)
6759 Teuchos::Array<SC> value1( 1, 0. );
6760 Teuchos::Array<SC> value2( 1, 0. );
6761 Teuchos::Array<GO> indices( 1, 0 );
6763 for (
int j = 0; j < dPhiU->at(0).size(); j++)
6768 for (
int k = 0; k < dPhiU->size(); k++)
6771 valDB_1 = valDB_1 + weights->at(k) *
6772 ( phiP->at(k).at(i) * ( -u21[0][k] * dPhiTransU[k][j][1] + u22[0][k] * dPhiTransU[k][j][0] ) );
6773 valDB_2 = valDB_2 + weights->at(k) *
6774 ( phiP->at(k).at(i) * ( u11[0][k] * dPhiTransU[k][j][1] - u12[0][k] * dPhiTransU[k][j][0] ) );
6780 val1 = absDetB * val1;
6781 val2 = absDetB * val2;
6786 glob_j = dim * map2_rep->getGlobalElement(elements2->getElement(T).getNode(j));
6787 glob_i = map1_rep->getGlobalElement(elements->getElement(T).getNode(i));
6788 indices[0] = glob_j;
6790 DB->insertGlobalValues(glob_i, indices(), value1());
6792 indices[0] = glob_j;
6793 DB->insertGlobalValues(glob_i, indices(), value2());
6797 if (callFillComplete)
6799 DB->fillComplete(map2_unique, map1_unique);
6804 double val1, val2, val3;
6805 double valDB_1, valDB_2, valDB_3;
6806 vec_dbl_Type p1(3,0.0), p2(3,0.0), p3(3,0.0), p4(3,0.0);
6811 vec2D_dbl_Type u11(1, vec_dbl_Type(weights->size(), -1.));
6812 vec2D_dbl_Type u12(1, vec_dbl_Type(weights->size(), -1.));
6813 vec2D_dbl_Type u13(1, vec_dbl_Type(weights->size(), -1.));
6814 vec2D_dbl_Type u21(1, vec_dbl_Type(weights->size(), -1.));
6815 vec2D_dbl_Type u22(1, vec_dbl_Type(weights->size(), -1.));
6816 vec2D_dbl_Type u23(1, vec_dbl_Type(weights->size(), -1.));
6817 vec2D_dbl_Type u31(1, vec_dbl_Type(weights->size(), -1.));
6818 vec2D_dbl_Type u32(1, vec_dbl_Type(weights->size(), -1.));
6819 vec2D_dbl_Type u33(1, vec_dbl_Type(weights->size(), -1.));
6821 for (
int T = 0; T < elements->numberElements(); T++)
6823 p1 = pointsRep->at(elements->getElement(T).getNode(0));
6824 p2 = pointsRep->at(elements->getElement(T).getNode(1));
6825 p3 = pointsRep->at(elements->getElement(T).getNode(2));
6826 p4 = pointsRep->at(elements->getElement(T).getNode(3));
6828 Helper::buildTransformation(elements->getElement(T).getVectorNodeList(), pointsRep, B,FEType1);
6829 detB = B.computeInverse(Binv);
6830 absDetB = std::fabs(detB);
6833 vec3D_dbl_Type dPhiTransU( dPhiU->size(), vec2D_dbl_Type( dPhiU->at(0).size(), vec_dbl_Type(dim,0.) ) );
6834 applyBTinv( dPhiU, dPhiTransU, Binv );
6838 for(
int k = 0; k < dPhiTransU.size(); k++)
6850 for(
int i = 0; i < dPhiTransU[0].size(); i++)
6852 LO index1 = dim * elements2->getElement(T).getNode(i) + 0;
6853 LO index2 = dim * elements2->getElement(T).getNode(i) + 1;
6854 LO index3 = dim * elements2->getElement(T).getNode(i) + 2;
6855 u11[0][k] += uArray[index1] * dPhiTransU[k][i][0];
6856 u12[0][k] += uArray[index1] * dPhiTransU[k][i][1];
6857 u13[0][k] += uArray[index1] * dPhiTransU[k][i][2];
6858 u21[0][k] += uArray[index2] * dPhiTransU[k][i][0];
6859 u22[0][k] += uArray[index2] * dPhiTransU[k][i][1];
6860 u23[0][k] += uArray[index2] * dPhiTransU[k][i][2];
6861 u31[0][k] += uArray[index3] * dPhiTransU[k][i][0];
6862 u32[0][k] += uArray[index3] * dPhiTransU[k][i][1];
6863 u33[0][k] += uArray[index3] * dPhiTransU[k][i][2];
6867 for (
int i = 0; i < phiP->at(0).size(); i++)
6869 Teuchos::Array<SC> value1( 1, 0. );
6870 Teuchos::Array<SC> value2( 1, 0. );
6871 Teuchos::Array<SC> value3( 1, 0. );
6872 Teuchos::Array<GO> indices( 1, 0 );
6874 for (
int j = 0; j < dPhiU->at(0).size(); j++)
6880 for (
int k = 0; k < dPhiU->size(); k++)
6883 valDB_1 = valDB_1 + weights->at(k) *
6884 ( phiP->at(k).at(i) * ( -u21[0][k] * dPhiTransU[k][j][1] + u22[0][k] * dPhiTransU[k][j][0] -
6885 u31[0][k] * dPhiTransU[k][j][2] + u33[0][k] * dPhiTransU[k][j][0] ) );
6886 valDB_2 = valDB_2 + weights->at(k) *
6887 ( phiP->at(k).at(i) * ( u11[0][k] * dPhiTransU[k][j][1] - u12[0][k] * dPhiTransU[k][j][0] -
6888 u32[0][k] * dPhiTransU[k][j][2] + u33[0][k] * dPhiTransU[k][j][1] ) );
6889 valDB_3 = valDB_3 + weights->at(k) *
6890 ( phiP->at(k).at(i) * ( u11[0][k] * dPhiTransU[k][j][2] - u13[0][k] * dPhiTransU[k][j][0] +
6891 u22[0][k] * dPhiTransU[k][j][2] - u23[0][k] * dPhiTransU[k][j][1] ) );
6898 val1 = absDetB * val1;
6899 val2 = absDetB * val2;
6900 val3 = absDetB * val3;
6906 glob_j = dim * map2_rep->getGlobalElement(elements2->getElement(T).getNode(j));
6907 glob_i = map1_rep->getGlobalElement(elements->getElement(T).getNode(i));
6908 indices[0] = glob_j;
6910 DB->insertGlobalValues(glob_i, indices(), value1());
6912 indices[0] = glob_j;
6913 DB->insertGlobalValues(glob_i, indices(), value2());
6915 indices[0] = glob_j;
6916 DB->insertGlobalValues(glob_i, indices(), value3());
6920 if (callFillComplete)
6922 DB->fillComplete(map2_unique, map1_unique);
6928template <
class SC,
class LO,
class GO,
class NO>
6929void FE<SC,LO,GO,NO>::assemblySurfaceIntegralExternal(
int dim,
6931 MultiVectorPtr_Type f,
6932 MultiVectorPtr_Type d_rep,
6933 std::vector<SC>& funcParameter,
6935 ParameterListPtr_Type params,
6938 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
6940 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
6943 SmallMatrix<SC> B(dim);
6944 vec_dbl_Type b(dim);
6946 Teuchos::ArrayRCP< SC > valuesF = f->getDataNonConst(0);
6948 int flagSurface = params->sublist(
"Parameter Solid").get(
"Flag Surface",5);
6950 std::vector<double> valueFunc(dim);
6952 SC* paramsFunc = &(funcParameter[0]);
6955 for (UN T=0; T<elements->numberElements(); T++) {
6956 FiniteElement fe = elements->getElement( T );
6957 ElementsPtr_Type subEl = fe.getSubElements();
6958 for (
int surface=0; surface<fe.numSubElements(); surface++) {
6959 FiniteElement feSub = subEl->getElement( surface );
6960 if(subEl->getDimension() == dim-1 ){
6962 vec_int_Type nodeList = feSub.getVectorNodeListNonConst ();
6965 vec_dbl_Type solution_d = getSolution(nodeList, d_rep,dim);
6966 vec2D_dbl_Type nodes;
6967 nodes = getCoordinates(nodeList, pointsRep);
6970 double positions[18];
6972 for(
int i=0;i<6;i++)
6973 for(
int j=0;j<3;j++){
6974 positions[count] = nodes[i][j];
6980 paramsFunc[ funcParameter.size() - 1 ] = feSub.getFlag();
6981 vec_dbl_Type p1 = {0.,0.,0.};
6982 func( &p1[0], &valueFunc[0], paramsFunc);
6984 if(valueFunc[0] != 0.){
6986 double *residuumVector;
6987 #ifdef FEDD_HAVE_ACEGENINTERFACE
6989 AceGenInterface::PressureTriangle3D6 pt(valueFunc[0], 1., 35, &positions[0], &solution_d[0]);
6990 pt.computeTangentResidual();
6991 residuumVector = pt.getResiduum();
6994 for(
int i=0; i< nodeList.size() ; i++){
6995 for(
int d=0; d<dim; d++)
6996 valuesF[nodeList[i]*dim+d] += residuumVector[i*dim+d];
7012template <
class SC,
class LO,
class GO,
class NO>
7015 MultiVectorPtr_Type f,
7016 MultiVectorPtr_Type d_rep,
7017 MatrixPtr_Type &Kext,
7018 std::vector<SC>& funcParameter,
7020 ParameterListPtr_Type params,
7025 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
7027 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
7029 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
7032 vec_dbl_Type b(dim);
7034 Teuchos::ArrayRCP< SC > valuesF = f->getDataNonConst(0);
7036 std::vector<double> valueFunc(dim);
7038 SC* paramsFunc = &(funcParameter[0]);
7041 for (UN T=0; T<elements->numberElements(); T++) {
7043 ElementsPtr_Type subEl = fe.getSubElements();
7044 for (
int surface=0; surface<fe.numSubElements(); surface++) {
7046 if(subEl->getDimension() == dim-1 ){
7047 vec_int_Type nodeList = feSub.getVectorNodeListNonConst ();
7049 vec_dbl_Type solution_d = getSolution(nodeList, d_rep,dim);
7050 vec2D_dbl_Type nodes;
7051 nodes = getCoordinates(nodeList, pointsRep);
7054 double positions[18];
7056 for(
int i=0;i<6;i++){
7057 for(
int j=0;j<3;j++){
7058 positions[count] = nodes[i][j];
7064 vec_dbl_Type p1 = {0.,0.,0.};
7065 paramsFunc[ funcParameter.size() - 1 ] = feSub.getFlag();
7066 func( &p1[0], &valueFunc[0], paramsFunc);
7068 if(valueFunc[0] != 0.){
7070 double *residuumVector;
7073 #ifdef FEDD_HAVE_ACEGENINTERFACE
7074 AceGenInterface::PressureTriangle3D6 pt(valueFunc[0], 1.0, 35, &positions[0], &solution_d[0]);
7075 pt.computeTangentResidual();
7077 residuumVector = pt.getResiduum();
7078 stiffMat = pt.getStiffnessMatrix();
7084 int numNodes1 =nodeList.size();
7086 SmallMatrix_Type elementMatrixPrint(18,0.);
7087 for(
int i=0; i< 18 ; i++){
7088 for(
int j=0; j< 18; j++){
7089 if(std::fabs(stiffMat[i][j]) >1e-13)
7090 elementMatrixPrint[i][j] = stiffMat[i][j];
7095 SmallMatrix_Type elementMatrixWrite(18,0.);
7097 SmallMatrix_Type elementMatrixIDsRow(18,0.);
7098 SmallMatrix_Type elementMatrixIDsCol(18,0.);
7101 for (UN i=0; i < numNodes1 ; i++) {
7102 for(
int di=0; di<dim; di++){
7103 Teuchos::Array<SC> value1( numNodes1*dim, 0. );
7104 Teuchos::Array<GO> columnIndices1( numNodes1*dim, 0 );
7105 GO row =GO (dim* map->getGlobalElement( nodeList[i] )+di);
7106 LO rowLO = dim*i+di;
7108 for (UN j=0; j <numNodes1; j++){
7109 for(
int d=0; d<dim; d++){
7110 columnIndices1[dim*j+d] = GO ( dim * map->getGlobalElement( nodeList[j] ) + d );
7111 value1[dim*j+d] = stiffMat[rowLO][dim*j+d];
7114 Kext->insertGlobalValues( row, columnIndices1(), value1() );
7120 for(
int i=0; i< nodeList.size() ; i++){
7121 for(
int d=0; d<dim; d++){
7122 valuesF[nodeList[i]*dim+d] += residuumVector[i*dim+d];
7134 Kext->fillComplete(domainVec_.at(FEloc)->getMapVecFieldUnique(),domainVec_.at(FEloc)->getMapVecFieldUnique());
7139template <
class SC,
class LO,
class GO,
class NO>
7140void FE<SC,LO,GO,NO>::computeSurfaceNormal(
int dim,
7141 vec2D_dbl_ptr_Type pointsRep,
7142 vec_int_Type nodeList,
7147 vec_dbl_Type p1(dim),p2(dim);
7150 v_E[0] = pointsRep->at(nodeList[0]).at(1) - pointsRep->at(nodeList[1]).at(1);
7151 v_E[1] = -(pointsRep->at(nodeList[0]).at(0) - pointsRep->at(nodeList[1]).at(0));
7152 norm_v_E = std::sqrt(std::pow(v_E[0],2)+std::pow(v_E[1],2));
7157 p1[0] = pointsRep->at(nodeList[0]).at(0) - pointsRep->at(nodeList[1]).at(0);
7158 p1[1] = pointsRep->at(nodeList[0]).at(1) - pointsRep->at(nodeList[1]).at(1);
7159 p1[2] = pointsRep->at(nodeList[0]).at(2) - pointsRep->at(nodeList[1]).at(2);
7161 p2[0] = pointsRep->at(nodeList[0]).at(0) - pointsRep->at(nodeList[2]).at(0);
7162 p2[1] = pointsRep->at(nodeList[0]).at(1) - pointsRep->at(nodeList[2]).at(1);
7163 p2[2] = pointsRep->at(nodeList[0]).at(2) - pointsRep->at(nodeList[2]).at(2);
7165 v_E[0] = p1[1]*p2[2] - p1[2]*p2[1];
7166 v_E[1] = p1[2]*p2[0] - p1[0]*p2[2];
7167 v_E[2] = p1[0]*p2[1] - p1[1]*p2[0];
7169 norm_v_E = std::sqrt(std::pow(v_E[0],2)+std::pow(v_E[1],2)+std::pow(v_E[2],2));
7175template <
class SC,
class LO,
class GO,
class NO>
7176void FE<SC,LO,GO,NO>::assemblySurfaceIntegral(
int dim,
7178 MultiVectorPtr_Type f,
7179 std::string fieldType,
7181 std::vector<SC>& funcParameter) {
7185 UN FEloc = checkFE(dim,FEType);
7187 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
7189 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
7191 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
7192 vec2D_dbl_ptr_Type phi;
7193 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
7195 UN degFunc = funcParameter[funcParameter.size()-1] + 1.e-14;
7196 UN deg = Helper::determineDegree( dim-1, FEType, Helper::Deriv0) + degFunc;
7198 Helper::getPhi(phi, weights, dim-1, FEType, deg);
7200 vec2D_dbl_ptr_Type quadPoints;
7201 vec_dbl_ptr_Type w = Teuchos::rcp(
new vec_dbl_Type(0));
7202 Helper::getQuadratureValues(dim-1, deg, quadPoints, w, FEType);
7206 SmallMatrix<SC> B(dim);
7207 vec_dbl_Type b(dim);
7209 Teuchos::ArrayRCP< SC > valuesF = f->getDataNonConst(0);
7213 std::vector<double> valueFunc(dim);
7215 SC* params = &(funcParameter[0]);
7216 for (UN T=0; T<elements->numberElements(); T++) {
7217 FiniteElement fe = elements->getElement( T );
7218 ElementsPtr_Type subEl = fe.getSubElements();
7219 for (
int surface=0; surface<fe.numSubElements(); surface++) {
7220 FiniteElement feSub = subEl->getElement( surface );
7221 if(subEl->getDimension() == dim-1){
7223 params[ funcParameter.size() - 1 ] = feSub.getFlag();
7225 vec_int_Type nodeList = feSub.getVectorNodeListNonConst ();
7227 vec_dbl_Type v_E(dim,1.);
7230 Helper::computeSurfaceNormal(dim, pointsRep,nodeList,v_E,norm_v_E);
7232 Helper::buildTransformationSurface( nodeList, pointsRep, B, b, FEType);
7233 elScaling = B.computeScaling( );
7235 for (UN i=0; i < phi->at(0).size(); i++) {
7236 Teuchos::Array<SC> value(0);
7237 if ( fieldType ==
"Scalar" )
7238 value.resize( 1, 0. );
7239 else if ( fieldType ==
"Vector" )
7240 value.resize( dim, 0. );
7242 for (UN w=0; w<phi->size(); w++) {
7243 vec_dbl_Type x(dim,0.);
7244 for (
int k=0; k<dim; k++) {
7245 for (
int l=0; l<dim-1; l++){
7246 x[ k ] += B[k][l] * (*quadPoints)[ w ][ l ];
7251 func( &x[0], &valueFunc[0], params);
7252 if ( fieldType ==
"Scalar" )
7253 value[0] += weights->at(w) * valueFunc[0] * (*phi)[w][i];
7254 else if ( fieldType ==
"Vector" ){
7255 for (
int j=0; j<value.size(); j++){
7256 value[j] += weights->at(w) * valueFunc[j]*v_E[j]/norm_v_E * (*phi)[w][i];
7261 for (
int j=0; j<value.size(); j++)
7262 value[j] *= elScaling;
7264 if ( fieldType==
"Scalar" )
7265 valuesF[ nodeList[ i ] ] += value[0];
7268 else if ( fieldType==
"Vector" ){
7269 for (
int j=0; j<value.size(); j++)
7270 valuesF[ dim * nodeList[ i ] + j ] += value[j];
7279template <
class SC,
class LO,
class GO,
class NO>
7280void FE<SC,LO,GO,NO>::assemblySurfaceIntegralFlag(
int dim,
7282 MultiVectorPtr_Type f,
7283 std::string fieldType,
7285 std::vector<SC>& funcParameter) {
7288 TEUCHOS_TEST_FOR_EXCEPTION(funcParameter[0]!=0,std::logic_error,
"We only support constant functions for now.");
7290 UN FEloc = checkFE(dim,FEType);
7292 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
7294 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
7296 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
7297 vec2D_dbl_ptr_Type phi;
7298 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
7299 UN degFunc = funcParameter[0] + 1.e-14;
7300 UN deg = Helper::determineDegree( dim-1, FEType, Helper::Deriv0) + degFunc;
7302 Helper::getPhi(phi, weights, dim-1, FEType, deg);
7304 vec2D_dbl_ptr_Type quadPoints;
7305 vec_dbl_ptr_Type w = Teuchos::rcp(
new vec_dbl_Type(0));
7306 Helper::getQuadratureValues(dim-1, deg, quadPoints, w, FEType);
7310 SmallMatrix<SC> B(dim);
7311 vec_dbl_Type b(dim);
7313 Teuchos::ArrayRCP< SC > valuesF = f->getDataNonConst(0);
7316 std::vector<double> valueFunc(dim);
7317 SC* params = &(funcParameter[1]);
7318 for (UN T=0; T<elements->numberElements(); T++) {
7319 FiniteElement fe = elements->getElement( T );
7320 ElementsPtr_Type subEl = fe.getSubElements();
7321 for (
int surface=0; surface<fe.numSubElements(); surface++) {
7322 FiniteElement feSub = subEl->getElement( surface );
7323 if (params[1] == feSub.getFlag()){
7324 FiniteElement feSub = subEl->getElement( surface );
7325 vec_int_Type nodeList = feSub.getVectorNodeListNonConst ();
7326 Helper::buildTransformationSurface( nodeList, pointsRep, B, b, FEType);
7327 elScaling = B.computeScaling( );
7329 for (UN i=0; i < phi->at(0).size(); i++) {
7330 Teuchos::Array<SC> value(0);
7331 if ( fieldType ==
"Scalar" )
7332 value.resize( 1, 0. );
7333 else if ( fieldType ==
"Vector" )
7334 value.resize( dim, 0. );
7336 for (UN w=0; w<phi->size(); w++) {
7337 vec_dbl_Type x(dim,0.);
7338 for (
int k=0; k<dim; k++) {
7339 for (
int l=0; l<dim-1; l++)
7340 x[ k ] += B[k][l] * (*quadPoints)[ w ][ l ];
7344 func( &x[0], &valueFunc[0], params[0], params);
7346 if ( fieldType ==
"Scalar" )
7347 value[0] += weights->at(w) * valueFunc[0] * (*phi)[w][i];
7348 else if ( fieldType ==
"Vector" ){
7349 for (
int j=0; j<value.size(); j++){
7350 value[j] += weights->at(w) * valueFunc[j] * (*phi)[w][i];
7355 for (
int j=0; j<value.size(); j++)
7356 value[j] *= elScaling;
7358 if ( fieldType==
"Scalar" )
7359 valuesF[ nodeList[ i ] ] += value[0];
7362 else if ( fieldType==
"Vector" ){
7363 for (
int j=0; j<value.size(); j++)
7364 valuesF[ dim * nodeList[ i ] + j ] += value[j];
7373template <
class SC,
class LO,
class GO,
class NO>
7374void FE<SC,LO,GO,NO>::assemblyRHS(
int dim,
7376 MultiVectorPtr_Type a,
7377 std::string fieldType,
7379 std::vector<SC>& funcParameter
7382 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
7384 TEUCHOS_TEST_FOR_EXCEPTION( a.is_null(), std::runtime_error,
"MultiVector in assemblyConstRHS is null." );
7385 TEUCHOS_TEST_FOR_EXCEPTION( a->getNumVectors()>1, std::logic_error,
"Implement for numberMV > 1 ." );
7387 FEloc = checkFE(dim,FEType);
7389 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
7391 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
7393 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
7394 vec2D_dbl_ptr_Type phi;
7395 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
7402 UN deg = Helper::determineDegree( dim, FEType, Helper::Deriv0) + degFunc;
7404 vec2D_dbl_ptr_Type quadPoints;
7405 Helper::getQuadratureValues(dim, deg, quadPoints, weights, FEType);
7408 Helper::getPhi(phi, weights, dim, FEType, deg);
7412 SmallMatrix<SC> B(dim);
7414 vec_dbl_Type v_i(dim);
7415 vec_dbl_Type v_j(dim);
7417 Teuchos::ArrayRCP< SC > valuesRhs = a->getDataNonConst(0);
7421 std::vector<double> valueFunc(dim);
7422 SC* paras = &(funcParameter[0]);
7424 func( &x, &valueFunc[0], paras );
7427 for (UN T=0; T<elements->numberElements(); T++) {
7429 Helper::buildTransformation(elements->getElement(T).getVectorNodeList(), pointsRep, B, FEType);
7430 detB = B.computeDet( );
7431 absDetB = std::fabs(detB);
7433 vec2D_dbl_Type quadPointsTrans(weights->size(),vec_dbl_Type(dim));
7434 for(
int i=0; i< weights->size(); i++){
7435 for(
int j=0; j< dim ; j++){
7436 for(
int k=0; k< dim; k++){
7437 quadPointsTrans[i][j] += B[j][k]* quadPoints->at(i).at(k) ;
7439 quadPointsTrans[i][j] += pointsRep->at(elements->getElement(T).getNode(0)).at(j);
7442 for (UN i=0; i < phi->at(0).size(); i++) {
7443 if ( !fieldType.compare(
"Scalar") ) {
7444 value = Teuchos::ScalarTraits<SC>::zero();
7445 for (UN w=0; w<weights->size(); w++){
7446 func(&quadPointsTrans[w][0], &valueFunc[0] ,paras);
7447 value += weights->at(w) * phi->at(w).at(i)*valueFunc[0];
7450 LO row = (LO) elements->getElement(T).getNode(i);
7451 valuesRhs[row] += value;
7453 else if( !fieldType.compare(
"Vector") ) {
7454 for (UN d=0; d<dim; d++) {
7455 value = Teuchos::ScalarTraits<SC>::zero();
7456 for (UN w=0; w<weights->size(); w++){
7457 func(&quadPointsTrans[w][0], &valueFunc[0] ,paras);
7458 value += weights->at(w) * phi->at(w).at(i)*valueFunc[d];
7462 LO row = (LO) ( dim * elements->getElement(T).getNode(i) + d );
7463 valuesRhs[row] += v_i;
7467 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Invalid field type." );
7476template <
class SC,
class LO,
class GO,
class NO>
7483 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
7485 TEUCHOS_TEST_FOR_EXCEPTION( a.is_null(), std::runtime_error,
"Matrix is null." );
7488 FEloc = checkFE(dim,FEType);
7490 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
7492 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
7494 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
7495 vec2D_dbl_ptr_Type phi;
7496 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
7500 vec2D_dbl_ptr_Type quadPoints;
7509 vec_dbl_Type v_i(dim);
7510 vec_dbl_Type v_j(dim);
7513 for (UN T=0; T<elements->numberElements(); T++) {
7516 detB = B.computeDet( );
7517 absDetB = std::fabs(detB);
7519 for (UN i=0; i < phi->at(0).size(); i++) {
7520 Teuchos::Array<SC> value( 1, 0. );
7521 for (UN w=0; w<weights->size(); w++){
7522 value[0] += weights->at(w) * phi->at(w).at(i)*1.0;
7524 value[0] *= absDetB;
7525 LO row = (LO) elements->getElement(T).getNode(i);
7526 Teuchos::Array<GO> columnIndices( 1, 0 );
7528 a->insertGlobalValues( row, columnIndices(), value() );
7529 columnIndices[0] = row;
7530 aT->insertGlobalValues( 0, columnIndices(), value() );
7539template <
class SC,
class LO,
class GO,
class NO>
7540void FE<SC,LO,GO,NO>::assemblyRHSDegTest(
int dim,
7542 MultiVectorPtr_Type a,
7543 std::string fieldType,
7545 std::vector<SC>& funcParameter,
7548 TEUCHOS_TEST_FOR_EXCEPTION(FEType ==
"P0",std::logic_error,
"Not implemented for P0");
7550 TEUCHOS_TEST_FOR_EXCEPTION( a.is_null(), std::runtime_error,
"MultiVector in assemblyConstRHS is null." );
7551 TEUCHOS_TEST_FOR_EXCEPTION( a->getNumVectors()>1, std::logic_error,
"Implement for numberMV > 1 ." );
7553 UN FEloc = checkFE(dim,FEType);
7555 ElementsPtr_Type elements = domainVec_.at(FEloc)->getElementsC();
7557 vec2D_dbl_ptr_Type pointsRep = domainVec_.at(FEloc)->getPointsRepeated();
7559 MapConstPtr_Type map = domainVec_.at(FEloc)->getMapRepeated();
7560 vec2D_dbl_ptr_Type phi;
7561 vec_dbl_ptr_Type weights = Teuchos::rcp(
new vec_dbl_Type(0));
7564 vec2D_dbl_ptr_Type quadPoints;
7565 vec_dbl_ptr_Type w = Teuchos::rcp(
new vec_dbl_Type(0));
7573 vec_dbl_Type b(dim);
7575 vec_dbl_Type v_i(dim);
7576 vec_dbl_Type v_j(dim);
7578 Teuchos::ArrayRCP< SC > valuesRhs = a->getDataNonConst(0);
7582 std::vector<double> valueFunc(dim);
7583 SC* params = &(funcParameter[1]);
7584 for (UN T=0; T<elements->numberElements(); T++) {
7587 detB = B.computeDet( );
7588 absDetB = std::fabs(detB);
7590 for (UN i=0; i < phi->at(0).size(); i++) {
7591 Teuchos::Array<SC> value(1);
7592 for (UN w=0; w<weights->size(); w++){
7593 vec_dbl_Type x(dim,0.);
7594 for (
int k=0; k<dim; k++) {
7595 for (
int l=0; l<dim; l++)
7596 x[ k ] += B[k][l] * (*quadPoints)[ w ][ l ] + b[k];
7599 func( &x[0], &valueFunc[0], params);
7600 if ( !fieldType.compare(
"Scalar") ) {
7601 value[0] += weights->at(w) * valueFunc[0] * (*phi)[w][i];
7603 else if( !fieldType.compare(
"Vector") ) {
7604 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"No test for field type Vector." );
7607 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Invalid field type." );
7610 value[0] *= absDetB;
7611 LO row = (LO) elements->getElement(T).getNode(i);
7612 valuesRhs[row] += value[0];
7619template <
class SC,
class LO,
class GO,
class NO>
7620void FE<SC,LO,GO,NO>::buildFullDPhi(vec3D_dbl_ptr_Type dPhi, Teuchos::Array<SmallMatrix<double> >& dPhiMat){
7622 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.");
7624 int dim = dPhi->at(0).at(0).size();
7625 int nmbBasisFunc = dPhi->at(0).size();
7626 int nmbTotalBasisFunc = nmbBasisFunc * dim;
7628 for (
int p=0; p<dPhi->size(); p++) {
7629 for (
int i=0; i<nmbBasisFunc; i++) {
7630 dPhiMat[ p * nmbTotalBasisFunc + dim*i ][0][0] = dPhi->at(p).at(i).at(0);
7631 dPhiMat[ p * nmbTotalBasisFunc + dim*i ][0][1] = dPhi->at(p).at(i).at(1);
7632 dPhiMat[ p * nmbTotalBasisFunc + dim*i ][1][0] = 0.;
7633 dPhiMat[ p * nmbTotalBasisFunc + dim*i ][1][1] = 0.;
7635 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 1 ][0][0] = 0.;
7636 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 1 ][0][1] = 0.;
7637 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 1 ][1][0] = dPhi->at(p).at(i).at(0);
7638 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 1 ][1][1] = dPhi->at(p).at(i).at(1);
7643 for (
int p=0; p<dPhi->size(); p++) {
7644 for (
int i=0; i<nmbBasisFunc; i++) {
7645 dPhiMat[ p * nmbTotalBasisFunc + dim*i ][0][0] = dPhi->at(p).at(i).at(0);
7646 dPhiMat[ p * nmbTotalBasisFunc + dim*i ][0][1] = dPhi->at(p).at(i).at(1);
7647 dPhiMat[ p * nmbTotalBasisFunc + dim*i ][0][2] = dPhi->at(p).at(i).at(2);
7648 dPhiMat[ p * nmbTotalBasisFunc + dim*i ][1][0] = 0.;
7649 dPhiMat[ p * nmbTotalBasisFunc + dim*i ][1][1] = 0.;
7650 dPhiMat[ p * nmbTotalBasisFunc + dim*i ][1][2] = 0.;
7651 dPhiMat[ p * nmbTotalBasisFunc + dim*i ][2][0] = 0.;
7652 dPhiMat[ p * nmbTotalBasisFunc + dim*i ][2][1] = 0.;
7653 dPhiMat[ p * nmbTotalBasisFunc + dim*i ][2][2] = 0.;
7655 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 1 ][0][0] = 0.;
7656 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 1 ][0][1] = 0.;
7657 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 1 ][0][2] = 0.;
7658 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 1 ][1][0] = dPhi->at(p).at(i).at(0);
7659 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 1 ][1][1] = dPhi->at(p).at(i).at(1);
7660 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 1 ][1][2] = dPhi->at(p).at(i).at(2);
7661 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 1 ][2][0] = 0.;
7662 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 1 ][2][1] = 0.;
7663 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 1 ][2][2] = 0.;
7665 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 2 ][0][0] = 0.;
7666 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 2 ][0][1] = 0.;
7667 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 2 ][0][2] = 0.;
7668 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 2 ][1][0] = 0.;
7669 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 2 ][1][1] = 0.;
7670 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 2 ][1][2] = 0.;
7671 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 2 ][2][0] = dPhi->at(p).at(i).at(0);
7672 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 2 ][2][1] = dPhi->at(p).at(i).at(1);
7673 dPhiMat[ p * nmbTotalBasisFunc + dim*i + 2 ][2][2] = dPhi->at(p).at(i).at(2);
7679template <
class SC,
class LO,
class GO,
class NO>
7680void FE<SC,LO,GO,NO>::fillMatrixArray(SmallMatrix<double> &matIn,
double* matArrayOut, std::string order,
int offset){
7681 if (!order.compare(
"cols")) {
7682 for (
int j=0; j<matIn.size(); j++) {
7683 for (
int i=0; i<matIn.size(); i++) {
7684 matArrayOut[ j * matIn.size() + i + offset ] = matIn[i][j];
7688 else if(!order.compare(
"rows")) {
7689 for (
int i=0; i<matIn.size(); i++) {
7690 for (
int j=0; j<matIn.size(); j++) {
7691 matArrayOut[ i * matIn.size() + j + offset ] = matIn[i][j];
7696 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Unknown ordering for matrix to array conversion. Choose rows or cols.");
7699template <
class SC,
class LO,
class GO,
class NO>
7700void FE<SC,LO,GO,NO>::epsilonTensor(vec_dbl_Type &basisValues, SmallMatrix<SC> &epsilonValues,
int activeDof){
7702 for (
int i=0; i<epsilonValues.size(); i++) {
7703 for (
int j=0; j<epsilonValues.size(); j++) {
7704 epsilonValues[i][j] = 0.;
7706 epsilonValues[i][j] += 0.5*basisValues.at(j);
7709 epsilonValues[i][j] += 0.5*basisValues.at(i);
7715template <
class SC,
class LO,
class GO,
class NO>
7716int FE<SC,LO,GO,NO>::checkFE(
int dim,
7717 std::string FEType){
7720 std::vector<int> matches;
7721 for (
int i = 0; i < domainVec_.size(); i++) {
7722 if (domainVec_.at(i)->getDimension() == dim)
7723 matches.push_back(i);
7727 for (
int i = 0; i < matches.size();i++) {
7728 if (domainVec_.at( matches.at(i) )->getFEType() == FEType) {
7729 FEloc = matches.at(i);
7734 TEUCHOS_TEST_FOR_EXCEPTION(!found, std::logic_error ,
"Combination of dimenson(2/3) and FE Type(P1/P2) not defined yet. Use addFE(domain)");
7752template <
class SC,
class LO,
class GO,
class NO>
7753void FE<SC,LO,GO,NO>::nh3d(
double* v,
double (*E),
double (*Nu),
double** F ,
double** Pmat,
double**** Amat)
7757 v[323]=(*E)/(1e0+(*Nu));
7758 v[3]=((*Nu)*v[323])/(1e0-2e0*(*Nu));
7768 v[18]=F[0][0]*F[0][1]+F[1][0]*F[1][1]+F[2][0]*F[2][1];
7769 v[335]=(v[18]*v[18]);
7771 v[24]=F[0][1]*F[0][2]+F[1][1]*F[1][2]+F[2][1]*F[2][2];
7772 v[334]=(v[24]*v[24]);
7774 v[22]=F[0][0]*F[0][2]+F[1][0]*F[1][2]+F[2][0]*F[2][2];
7775 v[15]=Power(F[0][0],2)+Power(F[1][0],2)+Power(F[2][0],2);
7776 v[228]=-(F[2][1]*v[18]);
7777 v[225]=F[2][2]*v[18];
7778 v[217]=-(F[1][1]*v[18]);
7779 v[214]=F[1][2]*v[18];
7780 v[194]=-(F[2][0]*v[18]);
7781 v[185]=-(F[1][0]*v[18]);
7782 v[268]=F[2][1]*v[22];
7783 v[264]=-(F[2][2]*v[22]);
7784 v[255]=F[1][1]*v[22];
7785 v[251]=-(F[1][2]*v[22]);
7786 v[190]=-(F[2][0]*v[22]);
7787 v[181]=-(F[1][0]*v[22]);
7788 v[172]=-(F[0][0]*v[22]);
7789 v[20]=Power(F[0][1],2)+Power(F[1][1],2)+Power(F[2][1],2);
7790 v[324]=-(v[20]*v[22]);
7791 v[327]=2e0*(v[324]+v[325]);
7795 v[138]=v[15]*v[20]-v[335];
7796 v[270]=F[2][0]*v[24];
7797 v[260]=-(F[2][2]*v[24]);
7798 v[257]=F[1][0]*v[24];
7799 v[247]=-(F[1][2]*v[24]);
7800 v[244]=F[0][0]*v[24];
7801 v[232]=-(F[0][2]*v[24]);
7802 v[222]=-(F[2][1]*v[24]);
7803 v[211]=-(F[1][1]*v[24]);
7804 v[198]=-(F[0][1]*v[24]);
7805 v[168]=v[18]*v[22]-v[15]*v[24];
7809 v[38]=-(v[22]*v[22]);
7810 v[26]=Power(F[0][2],2)+Power(F[1][2],2)+Power(F[2][2],2);
7811 v[333]=v[20]*v[26]-v[334];
7812 v[351]=2e0*F[0][0]*v[333];
7813 v[236]=v[22]*v[24]-v[18]*v[26];
7822 v[148]=v[15]*v[26]+v[38];
7823 v[29]=v[148]*v[20]+2e0*v[22]*v[325]-v[15]*v[334]-v[26]*v[335];
7824 v[336]=1e0/Power(v[29],2);
7825 v[32]=-v[5]+v[3]*std::log(std::sqrt(v[29]));
7826 v[337]=(v[3]/4e0-v[32]/2e0)*v[336];
7827 v[137]=v[337]*(F[2][1]*v[326]+F[2][0]*v[327]-v[335]*v[88]+v[15]*v[94]);
7828 v[147]=v[137]*v[138];
7829 v[136]=v[337]*(F[2][2]*v[329]+F[2][0]*v[330]+v[38]*v[67]+v[15]*v[93]);
7830 v[156]=v[136]*v[148];
7831 v[135]=v[337]*(F[2][2]*v[327]+F[2][1]*v[328]-v[334]*v[58]+v[20]*v[99]);
7832 v[165]=v[135]*v[333];
7833 v[134]=v[337]*(F[1][1]*v[326]+F[1][0]*v[327]-v[335]*v[87]+v[15]*v[92]);
7834 v[144]=v[134]*v[138];
7835 v[133]=v[337]*(F[1][2]*v[331]+F[1][0]*v[332]+v[38]*v[66]+v[15]*v[91]);
7836 v[153]=v[133]*v[148];
7837 v[132]=v[337]*(F[1][2]*v[327]+F[1][1]*v[328]-v[334]*v[57]+v[20]*v[97]);
7838 v[162]=v[132]*v[333];
7839 v[131]=v[337]*(F[0][0]*v[327]+F[0][1]*v[329]-v[335]*v[86]+v[15]*v[90]);
7840 v[130]=v[337]*(F[0][2]*v[331]+F[0][0]*v[332]+v[38]*v[65]+v[15]*v[89]);
7841 v[128]=v[337]*(F[0][2]*v[327]+F[0][1]*v[330]+v[351]);
7842 v[37]=v[32]/(2e0*v[29]);
7843 v[355]=v[37]*(2e0*v[172]+v[15]*v[86]);
7844 v[353]=v[37]*(2e0*v[232]+v[89]);
7845 v[352]=v[37]*(2e0*v[198]+v[90]);
7846 v[349]=-2e0*(F[1][0]*v[20]+v[217])*v[37];
7847 v[348]=-(v[37]*(2e0*v[185]+v[15]*v[66]));
7848 v[347]=-2e0*(F[2][0]*v[20]+v[228])*v[37];
7849 v[346]=-(v[37]*(2e0*v[194]+v[15]*v[67]));
7850 v[345]=-(v[37]*(2e0*v[251]+v[97]));
7851 v[344]=-(v[37]*(2e0*v[181]+v[15]*v[87]));
7852 v[343]=-(v[37]*(2e0*v[264]+v[99]));
7853 v[342]=-(v[37]*(2e0*v[190]+v[15]*v[88]));
7854 v[341]=-(v[37]*(2e0*v[247]+v[91]));
7855 v[340]=-(v[37]*(2e0*v[211]+v[92]));
7856 v[339]=-(v[37]*(2e0*v[260]+v[93]));
7857 v[338]=-(v[37]*(2e0*v[222]+v[94]));
7858 v[272]=v[137]*v[328]+v[37]*(2e0*v[268]+2e0*v[270]-2e0*v[18]*v[88]);
7859 v[267]=v[136]*v[328]+v[343];
7860 v[263]=v[135]*v[328]+v[339];
7861 v[259]=v[134]*v[328]+v[37]*(2e0*v[255]+2e0*v[257]-2e0*v[18]*v[87]);
7862 v[254]=v[133]*v[328]+v[345];
7863 v[250]=v[132]*v[328]+v[341];
7864 v[246]=v[131]*v[328]+v[37]*(2e0*F[0][1]*v[22]+2e0*v[244]-2e0*v[18]*v[86]);
7865 v[241]=v[130]*v[328]+2e0*(F[0][2]*v[22]-F[0][0]*v[26])*v[37];
7866 v[231]=v[137]*v[327]+v[347];
7867 v[227]=v[136]*v[327]+v[37]*(2e0*v[225]+2e0*v[270]-2e0*v[22]*v[67]);
7868 v[224]=v[135]*v[327]+v[338];
7869 v[301]=2e0*F[1][0]*v[165]+F[1][2]*v[224]+F[1][1]*v[263];
7870 v[279]=2e0*F[0][0]*v[165]+F[0][2]*v[224]+F[0][1]*v[263];
7871 v[220]=v[134]*v[327]+v[349];
7872 v[216]=v[133]*v[327]+v[37]*(2e0*v[214]+2e0*v[257]-2e0*v[22]*v[66]);
7873 v[213]=v[132]*v[327]+v[340];
7874 v[276]=2e0*F[0][0]*v[162]+F[0][2]*v[213]+F[0][1]*v[250];
7875 v[209]=v[131]*v[327]+2e0*(F[0][1]*v[18]-F[0][0]*v[20])*v[37];
7876 v[196]=v[137]*v[326]+v[346];
7877 v[314]=2e0*F[1][2]*v[147]+F[1][1]*v[196]+F[1][0]*v[231];
7878 v[296]=2e0*F[0][2]*v[147]+F[0][1]*v[196]+F[0][0]*v[231];
7879 v[192]=v[136]*v[326]+v[342];
7880 v[308]=2e0*F[1][1]*v[156]+F[1][2]*v[192]+F[1][0]*v[267];
7881 v[288]=2e0*F[0][1]*v[156]+F[0][2]*v[192]+F[0][0]*v[267];
7882 v[188]=v[135]*v[326]+v[37]*(2e0*v[225]+2e0*v[268]-2e0*v[24]*v[58]);
7883 v[187]=v[134]*v[326]+v[348];
7884 v[293]=2e0*F[0][2]*v[144]+F[0][1]*v[187]+F[0][0]*v[220];
7885 v[183]=v[133]*v[326]+v[344];
7886 v[285]=2e0*F[0][1]*v[153]+F[0][2]*v[183]+F[0][0]*v[254];
7887 v[179]=v[132]*v[326]+v[37]*(2e0*v[214]+2e0*v[255]-2e0*v[24]*v[57]);
7888 v[178]=v[131]*v[326]+2e0*(-(F[0][1]*v[15])+F[0][0]*v[18])*v[37];
7889 v[167]=v[137]*v[333]-v[338];
7890 v[303]=2e0*F[1][0]*v[167]+F[1][2]*v[231]+F[1][1]*v[272];
7891 v[281]=2e0*F[0][0]*v[167]+F[0][2]*v[231]+F[0][1]*v[272];
7892 v[166]=v[136]*v[333]-v[339];
7893 v[302]=2e0*F[1][0]*v[166]+F[1][2]*v[227]+F[1][1]*v[267];
7894 v[280]=2e0*F[0][0]*v[166]+F[0][2]*v[227]+F[0][1]*v[267];
7895 v[164]=v[134]*v[333]-v[340];
7896 v[278]=2e0*F[0][0]*v[164]+F[0][2]*v[220]+F[0][1]*v[259];
7897 v[163]=v[133]*v[333]-v[341];
7898 v[277]=2e0*F[0][0]*v[163]+F[0][2]*v[216]+F[0][1]*v[254];
7899 v[157]=v[137]*v[148]-v[342];
7900 v[309]=2e0*F[1][1]*v[157]+F[1][2]*v[196]+F[1][0]*v[272];
7901 v[289]=2e0*F[0][1]*v[157]+F[0][2]*v[196]+F[0][0]*v[272];
7902 v[155]=v[135]*v[148]-v[343];
7903 v[307]=2e0*F[1][1]*v[155]+F[1][2]*v[188]+F[1][0]*v[263];
7904 v[287]=2e0*F[0][1]*v[155]+F[0][2]*v[188]+F[0][0]*v[263];
7905 v[154]=v[134]*v[148]-v[344];
7906 v[286]=2e0*F[0][1]*v[154]+F[0][2]*v[187]+F[0][0]*v[259];
7907 v[284]=F[0][2]*v[179]+F[0][0]*v[250]+2e0*F[0][1]*(v[132]*v[148]-v[345]);
7908 v[146]=v[136]*v[138]-v[346];
7909 v[313]=2e0*F[1][2]*v[146]+F[1][1]*v[192]+F[1][0]*v[227];
7910 v[295]=2e0*F[0][2]*v[146]+F[0][1]*v[192]+F[0][0]*v[227];
7911 v[145]=v[135]*v[138]-v[347];
7912 v[312]=2e0*F[1][2]*v[145]+F[1][1]*v[188]+F[1][0]*v[224];
7913 v[294]=2e0*F[0][2]*v[145]+F[0][1]*v[188]+F[0][0]*v[224];
7914 v[292]=F[0][1]*v[183]+F[0][0]*v[216]+2e0*F[0][2]*(v[133]*v[138]-v[348]);
7915 v[291]=F[0][1]*v[179]+F[0][0]*v[213]+(v[132]*v[138]-v[349])*v[356];
7916 v[35]=v[36]+v[138]*v[37];
7918 v[40]=v[36]+v[148]*v[37];
7920 v[43]=v[36]+v[333]*v[37];
7923 v[319]=2e0*F[2][1]*v[157]+F[2][2]*v[196]+F[2][0]*v[272]+v[44];
7924 v[306]=2e0*F[1][1]*v[154]+F[1][2]*v[187]+F[1][0]*v[259]+v[44];
7925 v[283]=F[0][2]*v[178]+F[0][0]*v[246]+v[354]*(v[131]*v[148]+v[355])+v[44];
7927 v[317]=2e0*F[2][0]*v[167]+F[2][2]*v[231]+F[2][1]*v[272]+v[45];
7928 v[300]=2e0*F[1][0]*v[164]+F[1][2]*v[220]+F[1][1]*v[259]+v[45];
7929 v[275]=F[0][2]*v[209]+F[0][1]*v[246]+2e0*F[0][0]*(v[131]*v[333]+v[352])+v[45];
7931 v[316]=2e0*F[2][0]*v[166]+F[2][2]*v[227]+F[2][1]*v[267]+v[46];
7932 v[299]=2e0*F[1][0]*v[163]+F[1][2]*v[216]+F[1][1]*v[254]+v[46];
7933 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]*
7934 (2e0*F[0][2]*v[18]+2e0*v[244]-2e0*v[22]*v[65]));
7935 Pmat[0][0]=F[0][0]*v[297]+F[0][2]*v[45]+F[0][1]*v[46];
7936 Pmat[0][1]=F[0][1]*v[304]+F[0][2]*v[44]+F[0][0]*v[46];
7937 Pmat[0][2]=F[0][2]*v[310]+F[0][1]*v[44]+F[0][0]*v[45];
7938 Pmat[1][0]=2e0*F[1][0]*v[43]+F[1][2]*v[45]+F[1][1]*v[46];
7939 Pmat[1][1]=2e0*F[1][1]*v[40]+F[1][2]*v[44]+F[1][0]*v[46];
7940 Pmat[1][2]=2e0*F[1][2]*v[35]+F[1][1]*v[44]+F[1][0]*v[45];
7941 Pmat[2][0]=F[2][0]*v[297]+F[2][2]*v[45]+F[2][1]*v[46];
7942 Pmat[2][1]=F[2][1]*v[304]+F[2][2]*v[44]+F[2][0]*v[46];
7943 Pmat[2][2]=F[2][2]*v[310]+F[2][1]*v[44]+F[2][0]*v[45];
7944 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]
7946 Amat[0][0][0][1]=v[274];
7947 Amat[0][0][0][2]=v[275];
7948 Amat[0][0][1][0]=v[276];
7949 Amat[0][0][1][1]=v[277];
7950 Amat[0][0][1][2]=v[278];
7951 Amat[0][0][2][0]=v[279];
7952 Amat[0][0][2][1]=v[280];
7953 Amat[0][0][2][2]=v[281];
7954 Amat[0][1][0][0]=v[274];
7955 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]);
7956 Amat[0][1][0][2]=v[283];
7957 Amat[0][1][1][0]=v[284];
7958 Amat[0][1][1][1]=v[285];
7959 Amat[0][1][1][2]=v[286];
7960 Amat[0][1][2][0]=v[287];
7961 Amat[0][1][2][1]=v[288];
7962 Amat[0][1][2][2]=v[289];
7963 Amat[0][2][0][0]=v[275];
7964 Amat[0][2][0][1]=v[283];
7965 Amat[0][2][0][2]=F[0][1]*v[178]+F[0][0]*v[209]+v[310]+v[131]*v[138]*v[356];
7966 Amat[0][2][1][0]=v[291];
7967 Amat[0][2][1][1]=v[292];
7968 Amat[0][2][1][2]=v[293];
7969 Amat[0][2][2][0]=v[294];
7970 Amat[0][2][2][1]=v[295];
7971 Amat[0][2][2][2]=v[296];
7972 Amat[1][0][0][0]=v[276];
7973 Amat[1][0][0][1]=v[284];
7974 Amat[1][0][0][2]=v[291];
7975 Amat[1][0][1][0]=2e0*F[1][0]*v[162]+F[1][2]*v[213]+F[1][1]*v[250]+v[297];
7976 Amat[1][0][1][1]=v[299];
7977 Amat[1][0][1][2]=v[300];
7978 Amat[1][0][2][0]=v[301];
7979 Amat[1][0][2][1]=v[302];
7980 Amat[1][0][2][2]=v[303];
7981 Amat[1][1][0][0]=v[277];
7982 Amat[1][1][0][1]=v[285];
7983 Amat[1][1][0][2]=v[292];
7984 Amat[1][1][1][0]=v[299];
7985 Amat[1][1][1][1]=2e0*F[1][1]*v[153]+F[1][2]*v[183]+F[1][0]*v[254]+v[304];
7986 Amat[1][1][1][2]=v[306];
7987 Amat[1][1][2][0]=v[307];
7988 Amat[1][1][2][1]=v[308];
7989 Amat[1][1][2][2]=v[309];
7990 Amat[1][2][0][0]=v[278];
7991 Amat[1][2][0][1]=v[286];
7992 Amat[1][2][0][2]=v[293];
7993 Amat[1][2][1][0]=v[300];
7994 Amat[1][2][1][1]=v[306];
7995 Amat[1][2][1][2]=2e0*F[1][2]*v[144]+F[1][1]*v[187]+F[1][0]*v[220]+v[310];
7996 Amat[1][2][2][0]=v[312];
7997 Amat[1][2][2][1]=v[313];
7998 Amat[1][2][2][2]=v[314];
7999 Amat[2][0][0][0]=v[279];
8000 Amat[2][0][0][1]=v[287];
8001 Amat[2][0][0][2]=v[294];
8002 Amat[2][0][1][0]=v[301];
8003 Amat[2][0][1][1]=v[307];
8004 Amat[2][0][1][2]=v[312];
8005 Amat[2][0][2][0]=2e0*F[2][0]*v[165]+F[2][2]*v[224]+F[2][1]*v[263]+v[297];
8006 Amat[2][0][2][1]=v[316];
8007 Amat[2][0][2][2]=v[317];
8008 Amat[2][1][0][0]=v[280];
8009 Amat[2][1][0][1]=v[288];
8010 Amat[2][1][0][2]=v[295];
8011 Amat[2][1][1][0]=v[302];
8012 Amat[2][1][1][1]=v[308];
8013 Amat[2][1][1][2]=v[313];
8014 Amat[2][1][2][0]=v[316];
8015 Amat[2][1][2][1]=2e0*F[2][1]*v[156]+F[2][2]*v[192]+F[2][0]*v[267]+v[304];
8016 Amat[2][1][2][2]=v[319];
8017 Amat[2][2][0][0]=v[281];
8018 Amat[2][2][0][1]=v[289];
8019 Amat[2][2][0][2]=v[296];
8020 Amat[2][2][1][0]=v[303];
8021 Amat[2][2][1][1]=v[309];
8022 Amat[2][2][1][2]=v[314];
8023 Amat[2][2][2][0]=v[317];
8024 Amat[2][2][2][1]=v[319];
8025 Amat[2][2][2][2]=2e0*F[2][2]*v[147]+F[2][1]*v[196]+F[2][0]*v[231]+v[310];
8042template <
class SC,
class LO,
class GO,
class NO>
8043void FE<SC,LO,GO,NO>::mr3d(
double* v,
double (*E),
double (*Nu),
double (*C)
8044 ,
double** F,
double** Pmat,
double**** Amat)
8048 v[4]=(*E)/(2e0+2e0*(*Nu));
8049 v[139]=((*C)*v[4])/2e0;
8050 v[5]=(*E)/(3e0-6e0*(*Nu));
8052 v[150]=v[139]*v[57];
8054 v[165]=v[139]*v[66];
8056 v[167]=v[139]*v[87];
8058 v[155]=v[139]*v[58];
8060 v[170]=v[139]*v[67];
8062 v[172]=v[139]*v[88];
8064 v[159]=v[139]*v[59];
8066 v[175]=v[139]*v[68];
8067 v[18]=F[0][0]*F[0][1]+F[1][0]*F[1][1]+F[2][0]*F[2][1];
8068 v[345]=(v[18]*v[18]);
8070 v[177]=v[139]*v[89];
8071 v[24]=F[0][1]*F[0][2]+F[1][1]*F[1][2]+F[2][1]*F[2][2];
8072 v[344]=(v[24]*v[24]);
8074 v[22]=F[0][0]*F[0][2]+F[1][0]*F[1][2]+F[2][0]*F[2][2];
8075 v[15]=Power(F[0][0],2)+Power(F[1][0],2)+Power(F[2][0],2);
8076 v[239]=-(F[2][1]*v[18]);
8077 v[236]=F[2][2]*v[18];
8078 v[228]=-(F[1][1]*v[18]);
8079 v[225]=F[1][2]*v[18];
8080 v[205]=-(F[2][0]*v[18]);
8081 v[196]=-(F[1][0]*v[18]);
8082 v[279]=F[2][1]*v[22];
8083 v[275]=-(F[2][2]*v[22]);
8084 v[266]=F[1][1]*v[22];
8085 v[262]=-(F[1][2]*v[22]);
8086 v[201]=-(F[2][0]*v[22]);
8087 v[192]=-(F[1][0]*v[22]);
8088 v[183]=-(F[0][0]*v[22]);
8089 v[20]=Power(F[0][1],2)+Power(F[1][1],2)+Power(F[2][1],2);
8090 v[334]=-(v[20]*v[22]);
8091 v[337]=2e0*(v[334]+v[335]);
8095 v[140]=v[15]*v[20]-v[345];
8096 v[281]=F[2][0]*v[24];
8097 v[271]=-(F[2][2]*v[24]);
8098 v[268]=F[1][0]*v[24];
8099 v[258]=-(F[1][2]*v[24]);
8100 v[255]=F[0][0]*v[24];
8101 v[243]=-(F[0][2]*v[24]);
8102 v[233]=-(F[2][1]*v[24]);
8103 v[222]=-(F[1][1]*v[24]);
8104 v[209]=-(F[0][1]*v[24]);
8105 v[179]=v[18]*v[22]-v[15]*v[24];
8109 v[38]=-(v[22]*v[22]);
8110 v[26]=Power(F[0][2],2)+Power(F[1][2],2)+Power(F[2][2],2);
8111 v[343]=v[20]*v[26]-v[344];
8112 v[361]=v[343]*v[57];
8113 v[247]=v[22]*v[24]-v[18]*v[26];
8122 v[151]=v[15]*v[26]+v[38];
8123 v[29]=v[151]*v[20]+2e0*v[22]*v[335]-v[15]*v[344]-v[26]*v[345];
8124 v[346]=1e0/Power(v[29],2);
8125 v[33]=-2e0*v[139]-v[4]+v[5]*std::log(std::sqrt(v[29]));
8126 v[347]=v[346]*(-v[33]/2e0+v[5]/4e0);
8127 v[138]=v[347]*(F[2][1]*v[336]+F[2][0]*v[337]-v[345]*v[89]+v[15]*v[95]);
8128 v[149]=v[138]*v[140];
8129 v[137]=v[347]*(F[2][2]*v[339]+F[2][0]*v[340]+v[38]*v[68]+v[15]*v[94]);
8130 v[161]=v[137]*v[151];
8131 v[136]=v[347]*(v[100]*v[20]+F[2][2]*v[337]+F[2][1]*v[338]-v[344]*v[59]);
8132 v[174]=v[136]*v[343];
8133 v[135]=v[347]*(F[1][1]*v[336]+F[1][0]*v[337]-v[345]*v[88]+v[15]*v[93]);
8134 v[146]=v[135]*v[140];
8135 v[134]=v[347]*(F[1][2]*v[341]+F[1][0]*v[342]+v[38]*v[67]+v[15]*v[92]);
8136 v[157]=v[134]*v[151];
8137 v[133]=v[347]*(F[1][2]*v[337]+F[1][1]*v[338]-v[344]*v[58]+v[20]*v[98]);
8138 v[169]=v[133]*v[343];
8139 v[132]=v[347]*(F[0][0]*v[337]+F[0][1]*v[339]-v[345]*v[87]+v[15]*v[91]);
8140 v[131]=v[347]*(F[0][2]*v[341]+F[0][0]*v[342]+v[38]*v[66]+v[15]*v[90]);
8141 v[129]=v[347]*(F[0][2]*v[337]+F[0][1]*v[340]+v[361]);
8142 v[37]=v[33]/(2e0*v[29]);
8143 v[365]=v[37]*(2e0*v[183]+v[15]*v[87]);
8144 v[363]=v[37]*(2e0*v[243]+v[90]);
8145 v[362]=v[37]*(2e0*v[209]+v[91]);
8146 v[359]=-2e0*(F[1][0]*v[20]+v[228])*v[37];
8147 v[358]=-(v[37]*(2e0*v[196]+v[15]*v[67]));
8148 v[357]=-2e0*(F[2][0]*v[20]+v[239])*v[37];
8149 v[356]=-(v[37]*(2e0*v[205]+v[15]*v[68]));
8150 v[355]=-(v[37]*(2e0*v[262]+v[98]));
8151 v[354]=-(v[37]*(2e0*v[192]+v[15]*v[88]));
8152 v[353]=-((v[100]+2e0*v[275])*v[37]);
8153 v[352]=-(v[37]*(2e0*v[201]+v[15]*v[89]));
8154 v[351]=-(v[37]*(2e0*v[258]+v[92]));
8155 v[350]=-(v[37]*(2e0*v[222]+v[93]));
8156 v[349]=-(v[37]*(2e0*v[271]+v[94]));
8157 v[348]=-(v[37]*(2e0*v[233]+v[95]));
8158 v[283]=v[138]*v[338]+v[37]*(2e0*v[279]+2e0*v[281]-2e0*v[18]*v[89]);
8159 v[278]=-v[159]+v[137]*v[338]+v[353];
8160 v[274]=-v[175]+v[136]*v[338]+v[349];
8161 v[270]=v[135]*v[338]+v[37]*(2e0*v[266]+2e0*v[268]-2e0*v[18]*v[88]);
8162 v[265]=-v[155]+v[134]*v[338]+v[355];
8163 v[261]=-v[170]+v[133]*v[338]+v[351];
8164 v[257]=v[132]*v[338]+v[37]*(2e0*F[0][1]*v[22]+2e0*v[255]-2e0*v[18]*v[87]);
8165 v[252]=-v[150]+v[131]*v[338]+2e0*(F[0][2]*v[22]-F[0][0]*v[26])*v[37];
8166 v[242]=-v[159]+v[138]*v[337]+v[357];
8167 v[238]=v[137]*v[337]+v[37]*(2e0*v[236]+2e0*v[281]-2e0*v[22]*v[68]);
8168 v[235]=-v[177]+v[136]*v[337]+v[348];
8169 v[312]=2e0*F[1][0]*v[174]+F[1][2]*v[235]+F[1][1]*v[274];
8170 v[290]=2e0*F[0][0]*v[174]+F[0][2]*v[235]+F[0][1]*v[274];
8171 v[231]=-v[155]+v[135]*v[337]+v[359];
8172 v[227]=v[134]*v[337]+v[37]*(2e0*v[225]+2e0*v[268]-2e0*v[22]*v[67]);
8173 v[224]=-v[172]+v[133]*v[337]+v[350];
8174 v[287]=2e0*F[0][0]*v[169]+F[0][2]*v[224]+F[0][1]*v[261];
8175 v[220]=-v[150]+v[132]*v[337]+2e0*(F[0][1]*v[18]-F[0][0]*v[20])*v[37];
8176 v[207]=-v[175]+v[138]*v[336]+v[356];
8177 v[325]=2e0*F[1][2]*v[149]+F[1][1]*v[207]+F[1][0]*v[242];
8178 v[307]=2e0*F[0][2]*v[149]+F[0][1]*v[207]+F[0][0]*v[242];
8179 v[203]=-v[177]+v[137]*v[336]+v[352];
8180 v[319]=2e0*F[1][1]*v[161]+F[1][2]*v[203]+F[1][0]*v[278];
8181 v[299]=2e0*F[0][1]*v[161]+F[0][2]*v[203]+F[0][0]*v[278];
8182 v[199]=v[136]*v[336]+v[37]*(2e0*v[236]+2e0*v[279]-2e0*v[24]*v[59]);
8183 v[198]=-v[170]+v[135]*v[336]+v[358];
8184 v[304]=2e0*F[0][2]*v[146]+F[0][1]*v[198]+F[0][0]*v[231];
8185 v[194]=-v[172]+v[134]*v[336]+v[354];
8186 v[296]=2e0*F[0][1]*v[157]+F[0][2]*v[194]+F[0][0]*v[265];
8187 v[190]=v[133]*v[336]+v[37]*(2e0*v[225]+2e0*v[266]-2e0*v[24]*v[58]);
8188 v[189]=-v[165]+v[132]*v[336]+2e0*(-(F[0][1]*v[15])+F[0][0]*v[18])*v[37];
8189 v[178]=v[177]+v[138]*v[343]-v[348];
8190 v[314]=2e0*F[1][0]*v[178]+F[1][2]*v[242]+F[1][1]*v[283];
8191 v[292]=2e0*F[0][0]*v[178]+F[0][2]*v[242]+F[0][1]*v[283];
8192 v[176]=v[175]+v[137]*v[343]-v[349];
8193 v[313]=2e0*F[1][0]*v[176]+F[1][2]*v[238]+F[1][1]*v[278];
8194 v[291]=2e0*F[0][0]*v[176]+F[0][2]*v[238]+F[0][1]*v[278];
8195 v[173]=v[172]+v[135]*v[343]-v[350];
8196 v[289]=2e0*F[0][0]*v[173]+F[0][2]*v[231]+F[0][1]*v[270];
8197 v[171]=v[170]+v[134]*v[343]-v[351];
8198 v[288]=2e0*F[0][0]*v[171]+F[0][2]*v[227]+F[0][1]*v[265];
8199 v[162]=v[138]*v[151]+v[177]-v[352];
8200 v[320]=2e0*F[1][1]*v[162]+F[1][2]*v[207]+F[1][0]*v[283];
8201 v[300]=2e0*F[0][1]*v[162]+F[0][2]*v[207]+F[0][0]*v[283];
8202 v[160]=v[136]*v[151]+v[159]-v[353];
8203 v[318]=2e0*F[1][1]*v[160]+F[1][2]*v[199]+F[1][0]*v[274];
8204 v[298]=2e0*F[0][1]*v[160]+F[0][2]*v[199]+F[0][0]*v[274];
8205 v[158]=v[135]*v[151]+v[172]-v[354];
8206 v[297]=2e0*F[0][1]*v[158]+F[0][2]*v[198]+F[0][0]*v[270];
8207 v[295]=F[0][2]*v[190]+F[0][0]*v[261]+2e0*F[0][1]*(v[133]*v[151]+v[155]-v[355]);
8208 v[148]=v[137]*v[140]+v[175]-v[356];
8209 v[324]=2e0*F[1][2]*v[148]+F[1][1]*v[203]+F[1][0]*v[238];
8210 v[306]=2e0*F[0][2]*v[148]+F[0][1]*v[203]+F[0][0]*v[238];
8211 v[147]=v[136]*v[140]+v[159]-v[357];
8212 v[323]=2e0*F[1][2]*v[147]+F[1][1]*v[199]+F[1][0]*v[235];
8213 v[305]=2e0*F[0][2]*v[147]+F[0][1]*v[199]+F[0][0]*v[235];
8214 v[303]=F[0][1]*v[194]+F[0][0]*v[227]+2e0*F[0][2]*(v[134]*v[140]+v[170]-v[358]);
8215 v[302]=F[0][1]*v[190]+F[0][0]*v[224]+(v[133]*v[140]+v[155]-v[359])*v[366];
8216 v[36]=v[140]*v[37]+((1e0+(*C)*(-1e0+v[15]+v[20]))*v[4])/2e0;
8218 v[40]=v[151]*v[37]+((1e0+(*C)*(-1e0+v[15]+v[26]))*v[4])/2e0;
8220 v[43]=v[343]*v[37]+((1e0+(*C)*(-1e0+v[20]+v[26]))*v[4])/2e0;
8222 v[45]=-2e0*v[139]*v[24]+v[336]*v[37];
8223 v[330]=2e0*F[2][1]*v[162]+F[2][2]*v[207]+F[2][0]*v[283]+v[45];
8224 v[317]=2e0*F[1][1]*v[158]+F[1][2]*v[198]+F[1][0]*v[270]+v[45];
8225 v[294]=F[0][2]*v[189]+F[0][0]*v[257]+v[364]*(v[132]*v[151]+v[167]+v[365])+v[45];
8226 v[46]=-2e0*v[139]*v[22]+v[337]*v[37];
8227 v[328]=2e0*F[2][0]*v[178]+F[2][2]*v[242]+F[2][1]*v[283]+v[46];
8228 v[311]=2e0*F[1][0]*v[173]+F[1][2]*v[231]+F[1][1]*v[270]+v[46];
8229 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];
8230 v[47]=-2e0*v[139]*v[18]+v[338]*v[37];
8231 v[327]=2e0*F[2][0]*v[176]+F[2][2]*v[238]+F[2][1]*v[278]+v[47];
8232 v[310]=2e0*F[1][0]*v[171]+F[1][2]*v[227]+F[1][1]*v[265]+v[47];
8233 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]*
8234 (2e0*F[0][2]*v[18]+2e0*v[255]-2e0*v[22]*v[66]));
8235 Pmat[0][0]=F[0][0]*v[308]+F[0][2]*v[46]+F[0][1]*v[47];
8236 Pmat[0][1]=F[0][1]*v[315]+F[0][2]*v[45]+F[0][0]*v[47];
8237 Pmat[0][2]=F[0][2]*v[321]+F[0][1]*v[45]+F[0][0]*v[46];
8238 Pmat[1][0]=2e0*F[1][0]*v[43]+F[1][2]*v[46]+F[1][1]*v[47];
8239 Pmat[1][1]=2e0*F[1][1]*v[40]+F[1][2]*v[45]+F[1][0]*v[47];
8240 Pmat[1][2]=2e0*F[1][2]*v[36]+F[1][1]*v[45]+F[1][0]*v[46];
8241 Pmat[2][0]=F[2][0]*v[308]+F[2][2]*v[46]+F[2][1]*v[47];
8242 Pmat[2][1]=F[2][1]*v[315]+F[2][2]*v[45]+F[2][0]*v[47];
8243 Pmat[2][2]=F[2][2]*v[321]+F[2][1]*v[45]+F[2][0]*v[46];
8244 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]
8245 +v[129]*v[338]-v[363]);
8246 Amat[0][0][0][1]=v[285];
8247 Amat[0][0][0][2]=v[286];
8248 Amat[0][0][1][0]=v[287];
8249 Amat[0][0][1][1]=v[288];
8250 Amat[0][0][1][2]=v[289];
8251 Amat[0][0][2][0]=v[290];
8252 Amat[0][0][2][1]=v[291];
8253 Amat[0][0][2][2]=v[292];
8254 Amat[0][1][0][0]=v[285];
8255 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]);
8256 Amat[0][1][0][2]=v[294];
8257 Amat[0][1][1][0]=v[295];
8258 Amat[0][1][1][1]=v[296];
8259 Amat[0][1][1][2]=v[297];
8260 Amat[0][1][2][0]=v[298];
8261 Amat[0][1][2][1]=v[299];
8262 Amat[0][1][2][2]=v[300];
8263 Amat[0][2][0][0]=v[286];
8264 Amat[0][2][0][1]=v[294];
8265 Amat[0][2][0][2]=F[0][1]*v[189]+F[0][0]*v[220]+v[321]+v[132]*v[140]*v[366];
8266 Amat[0][2][1][0]=v[302];
8267 Amat[0][2][1][1]=v[303];
8268 Amat[0][2][1][2]=v[304];
8269 Amat[0][2][2][0]=v[305];
8270 Amat[0][2][2][1]=v[306];
8271 Amat[0][2][2][2]=v[307];
8272 Amat[1][0][0][0]=v[287];
8273 Amat[1][0][0][1]=v[295];
8274 Amat[1][0][0][2]=v[302];
8275 Amat[1][0][1][0]=2e0*F[1][0]*v[169]+F[1][2]*v[224]+F[1][1]*v[261]+v[308];
8276 Amat[1][0][1][1]=v[310];
8277 Amat[1][0][1][2]=v[311];
8278 Amat[1][0][2][0]=v[312];
8279 Amat[1][0][2][1]=v[313];
8280 Amat[1][0][2][2]=v[314];
8281 Amat[1][1][0][0]=v[288];
8282 Amat[1][1][0][1]=v[296];
8283 Amat[1][1][0][2]=v[303];
8284 Amat[1][1][1][0]=v[310];
8285 Amat[1][1][1][1]=2e0*F[1][1]*v[157]+F[1][2]*v[194]+F[1][0]*v[265]+v[315];
8286 Amat[1][1][1][2]=v[317];
8287 Amat[1][1][2][0]=v[318];
8288 Amat[1][1][2][1]=v[319];
8289 Amat[1][1][2][2]=v[320];
8290 Amat[1][2][0][0]=v[289];
8291 Amat[1][2][0][1]=v[297];
8292 Amat[1][2][0][2]=v[304];
8293 Amat[1][2][1][0]=v[311];
8294 Amat[1][2][1][1]=v[317];
8295 Amat[1][2][1][2]=2e0*F[1][2]*v[146]+F[1][1]*v[198]+F[1][0]*v[231]+v[321];
8296 Amat[1][2][2][0]=v[323];
8297 Amat[1][2][2][1]=v[324];
8298 Amat[1][2][2][2]=v[325];
8299 Amat[2][0][0][0]=v[290];
8300 Amat[2][0][0][1]=v[298];
8301 Amat[2][0][0][2]=v[305];
8302 Amat[2][0][1][0]=v[312];
8303 Amat[2][0][1][1]=v[318];
8304 Amat[2][0][1][2]=v[323];
8305 Amat[2][0][2][0]=2e0*F[2][0]*v[174]+F[2][2]*v[235]+F[2][1]*v[274]+v[308];
8306 Amat[2][0][2][1]=v[327];
8307 Amat[2][0][2][2]=v[328];
8308 Amat[2][1][0][0]=v[291];
8309 Amat[2][1][0][1]=v[299];
8310 Amat[2][1][0][2]=v[306];
8311 Amat[2][1][1][0]=v[313];
8312 Amat[2][1][1][1]=v[319];
8313 Amat[2][1][1][2]=v[324];
8314 Amat[2][1][2][0]=v[327];
8315 Amat[2][1][2][1]=2e0*F[2][1]*v[161]+F[2][2]*v[203]+F[2][0]*v[278]+v[315];
8316 Amat[2][1][2][2]=v[330];
8317 Amat[2][2][0][0]=v[292];
8318 Amat[2][2][0][1]=v[300];
8319 Amat[2][2][0][2]=v[307];
8320 Amat[2][2][1][0]=v[314];
8321 Amat[2][2][1][1]=v[320];
8322 Amat[2][2][1][2]=v[325];
8323 Amat[2][2][2][0]=v[328];
8324 Amat[2][2][2][1]=v[330];
8325 Amat[2][2][2][2]=2e0*F[2][2]*v[149]+F[2][1]*v[207]+F[2][0]*v[242]+v[321];
8342template <
class SC,
class LO,
class GO,
class NO>
8343void FE<SC,LO,GO,NO>::stvk3d(
double* v,
double (*lam),
double (*mue),
double** F
8344 ,
double** Pmat,
double**** Amat)
8346 v[169]=Power(F[0][0],2);
8348 v[167]=Power(F[0][2],2);
8349 v[166]=F[2][2]*(*mue);
8350 v[165]=F[2][1]*(*mue);
8351 v[164]=F[2][0]*(*mue);
8352 v[163]=F[1][2]*(*mue);
8353 v[162]=F[1][1]*(*mue);
8354 v[161]=F[1][0]*(*mue);
8355 v[88]=F[0][0]*(*mue);
8356 v[116]=F[0][0]*v[88];
8357 v[70]=F[0][1]*(*lam);
8358 v[93]=F[0][1]*(*mue);
8359 v[117]=F[0][1]*v[93];
8360 v[71]=F[0][2]*(*lam);
8361 v[105]=(*mue)*v[167];
8362 v[72]=F[1][0]*(*lam);
8363 v[85]=2e0*v[161]+v[72];
8364 v[142]=F[1][0]*v[161];
8365 v[121]=F[0][0]*v[161];
8366 v[73]=F[1][1]*(*lam);
8367 v[100]=F[0][1]*v[161]+F[0][0]*v[73];
8368 v[82]=2e0*v[162]+v[73];
8369 v[143]=F[1][1]*v[162];
8370 v[122]=F[0][1]*v[162];
8371 v[108]=F[0][0]*v[162]+F[0][1]*v[72];
8372 v[74]=F[1][2]*(*lam);
8373 v[111]=F[0][2]*v[162]+F[0][1]*v[74];
8374 v[101]=F[0][2]*v[161]+F[0][0]*v[74];
8375 v[79]=2e0*v[163]+v[74];
8376 v[123]=v[121]+v[122]+F[0][2]*v[79];
8377 v[135]=F[1][2]*v[163];
8378 v[120]=F[0][1]*v[163]+F[0][2]*v[73];
8379 v[119]=F[0][0]*v[163]+F[0][2]*v[72];
8380 v[109]=F[0][2]*v[163];
8381 v[110]=v[109]+v[121]+F[0][1]*v[82];
8382 v[99]=v[109]+v[122]+F[0][0]*v[85];
8383 v[75]=F[2][0]*(*lam);
8384 v[86]=2e0*v[164]+v[75];
8385 v[156]=F[2][0]*v[164];
8386 v[147]=F[1][0]*v[164];
8387 v[126]=F[0][0]*v[164];
8388 v[76]=F[2][1]*(*lam);
8389 v[133]=F[1][1]*v[164]+F[1][0]*v[76];
8390 v[103]=F[0][1]*v[164]+F[0][0]*v[76];
8391 v[83]=2e0*v[165]+v[76];
8392 v[157]=F[2][1]*v[165];
8393 v[148]=F[1][1]*v[165];
8394 v[138]=F[1][0]*v[165]+F[1][1]*v[75];
8395 v[127]=F[0][1]*v[165];
8396 v[112]=F[0][0]*v[165]+F[0][1]*v[75];
8397 v[77]=F[2][2]*(*lam);
8398 v[141]=F[1][2]*v[165]+F[1][1]*v[77];
8399 v[134]=F[1][2]*v[164]+F[1][0]*v[77];
8400 v[115]=F[0][2]*v[165]+F[0][1]*v[77];
8401 v[104]=F[0][2]*v[164]+F[0][0]*v[77];
8402 v[80]=2e0*v[166]+v[77];
8403 v[149]=v[147]+v[148]+F[1][2]*v[80];
8404 v[128]=v[126]+v[127]+F[0][2]*v[80];
8405 v[153]=F[2][2]*v[166];
8406 v[146]=F[1][1]*v[166]+F[1][2]*v[76];
8407 v[145]=F[1][0]*v[166]+F[1][2]*v[75];
8408 v[139]=F[1][2]*v[166];
8409 v[140]=v[139]+v[147]+F[1][1]*v[83];
8410 v[132]=v[139]+v[148]+F[1][0]*v[86];
8411 v[125]=F[0][1]*v[166]+F[0][2]*v[76];
8412 v[124]=F[0][0]*v[166]+F[0][2]*v[75];
8413 v[113]=F[0][2]*v[166];
8414 v[114]=v[113]+v[126]+F[0][1]*v[83];
8415 v[102]=v[113]+v[127]+F[0][0]*v[86];
8416 v[24]=(-1e0+Power(F[1][0],2)+Power(F[2][0],2)+v[169])/2e0;
8417 v[28]=(-1e0+Power(F[0][1],2)+Power(F[1][1],2)+Power(F[2][1],2))/2e0;
8418 v[32]=(-1e0+Power(F[1][2],2)+Power(F[2][2],2)+v[167])/2e0;
8419 v[36]=(*lam)*(v[24]+v[28]+v[32]);
8420 v[35]=2e0*(*mue)*v[32]+v[36];
8421 v[37]=2e0*(*mue)*v[28]+v[36];
8422 v[38]=2e0*(*mue)*v[24]+v[36];
8423 v[39]=(F[0][0]*F[0][2]+F[1][0]*F[1][2]+F[2][0]*F[2][2])*(*mue);
8424 v[152]=F[2][2]*v[164]+v[39]+F[2][0]*v[77];
8425 v[131]=F[1][2]*v[161]+v[39]+F[1][0]*v[74];
8426 v[98]=v[39]+F[0][0]*v[71]+F[0][2]*v[88];
8427 v[40]=(F[0][1]*F[0][2]+F[1][1]*F[1][2]+F[2][1]*F[2][2])*(*mue);
8428 v[155]=F[2][2]*v[165]+v[40]+F[2][1]*v[77];
8429 v[137]=F[1][2]*v[162]+v[40]+F[1][1]*v[74];
8430 v[107]=v[40]+F[0][1]*v[71]+F[0][2]*v[93];
8431 v[41]=(F[0][0]*F[0][1]+F[1][0]*F[1][1]+F[2][0]*F[2][1])*(*mue);
8432 v[151]=F[2][1]*v[164]+v[41]+F[2][0]*v[76];
8433 v[130]=F[1][1]*v[161]+v[41]+F[1][0]*v[73];
8434 v[97]=v[41]+F[0][0]*v[70]+F[0][1]*v[88];
8435 Pmat[0][0]=F[0][0]*v[38]+F[0][2]*v[39]+F[0][1]*v[41];
8436 Pmat[0][1]=F[0][1]*v[37]+F[0][2]*v[40]+F[0][0]*v[41];
8437 Pmat[0][2]=F[0][2]*v[35]+F[0][0]*v[39]+F[0][1]*v[40];
8438 Pmat[1][0]=F[1][0]*v[38]+F[1][2]*v[39]+F[1][1]*v[41];
8439 Pmat[1][1]=F[1][1]*v[37]+F[1][2]*v[40]+F[1][0]*v[41];
8440 Pmat[1][2]=F[1][2]*v[35]+F[1][0]*v[39]+F[1][1]*v[40];
8441 Pmat[2][0]=F[2][0]*v[38]+F[2][2]*v[39]+F[2][1]*v[41];
8442 Pmat[2][1]=F[2][1]*v[37]+F[2][2]*v[40]+F[2][0]*v[41];
8443 Pmat[2][2]=F[2][2]*v[35]+F[2][0]*v[39]+F[2][1]*v[40];
8444 Amat[0][0][0][0]=v[105]+v[117]+((*lam)+v[168])*v[169]+v[38];
8445 Amat[0][0][0][1]=v[97];
8446 Amat[0][0][0][2]=v[98];
8447 Amat[0][0][1][0]=v[99];
8448 Amat[0][0][1][1]=v[100];
8449 Amat[0][0][1][2]=v[101];
8450 Amat[0][0][2][0]=v[102];
8451 Amat[0][0][2][1]=v[103];
8452 Amat[0][0][2][2]=v[104];
8453 Amat[0][1][0][0]=v[97];
8454 Amat[0][1][0][1]=v[105]+v[116]+v[37]+F[0][1]*(v[70]+2e0*v[93]);
8455 Amat[0][1][0][2]=v[107];
8456 Amat[0][1][1][0]=v[108];
8457 Amat[0][1][1][1]=v[110];
8458 Amat[0][1][1][2]=v[111];
8459 Amat[0][1][2][0]=v[112];
8460 Amat[0][1][2][1]=v[114];
8461 Amat[0][1][2][2]=v[115];
8462 Amat[0][2][0][0]=v[98];
8463 Amat[0][2][0][1]=v[107];
8464 Amat[0][2][0][2]=v[116]+v[117]+v[35]+F[0][2]*(F[0][2]*v[168]+v[71]);
8465 Amat[0][2][1][0]=v[119];
8466 Amat[0][2][1][1]=v[120];
8467 Amat[0][2][1][2]=v[123];
8468 Amat[0][2][2][0]=v[124];
8469 Amat[0][2][2][1]=v[125];
8470 Amat[0][2][2][2]=v[128];
8471 Amat[1][0][0][0]=v[99];
8472 Amat[1][0][0][1]=v[108];
8473 Amat[1][0][0][2]=v[119];
8474 Amat[1][0][1][0]=v[135]+v[143]+v[38]+F[1][0]*v[85];
8475 Amat[1][0][1][1]=v[130];
8476 Amat[1][0][1][2]=v[131];
8477 Amat[1][0][2][0]=v[132];
8478 Amat[1][0][2][1]=v[133];
8479 Amat[1][0][2][2]=v[134];
8480 Amat[1][1][0][0]=v[100];
8481 Amat[1][1][0][1]=v[110];
8482 Amat[1][1][0][2]=v[120];
8483 Amat[1][1][1][0]=v[130];
8484 Amat[1][1][1][1]=v[135]+v[142]+v[37]+F[1][1]*v[82];
8485 Amat[1][1][1][2]=v[137];
8486 Amat[1][1][2][0]=v[138];
8487 Amat[1][1][2][1]=v[140];
8488 Amat[1][1][2][2]=v[141];
8489 Amat[1][2][0][0]=v[101];
8490 Amat[1][2][0][1]=v[111];
8491 Amat[1][2][0][2]=v[123];
8492 Amat[1][2][1][0]=v[131];
8493 Amat[1][2][1][1]=v[137];
8494 Amat[1][2][1][2]=v[142]+v[143]+v[35]+F[1][2]*v[79];
8495 Amat[1][2][2][0]=v[145];
8496 Amat[1][2][2][1]=v[146];
8497 Amat[1][2][2][2]=v[149];
8498 Amat[2][0][0][0]=v[102];
8499 Amat[2][0][0][1]=v[112];
8500 Amat[2][0][0][2]=v[124];
8501 Amat[2][0][1][0]=v[132];
8502 Amat[2][0][1][1]=v[138];
8503 Amat[2][0][1][2]=v[145];
8504 Amat[2][0][2][0]=v[153]+v[157]+v[38]+F[2][0]*v[86];
8505 Amat[2][0][2][1]=v[151];
8506 Amat[2][0][2][2]=v[152];
8507 Amat[2][1][0][0]=v[103];
8508 Amat[2][1][0][1]=v[114];
8509 Amat[2][1][0][2]=v[125];
8510 Amat[2][1][1][0]=v[133];
8511 Amat[2][1][1][1]=v[140];
8512 Amat[2][1][1][2]=v[146];
8513 Amat[2][1][2][0]=v[151];
8514 Amat[2][1][2][1]=v[153]+v[156]+v[37]+F[2][1]*v[83];
8515 Amat[2][1][2][2]=v[155];
8516 Amat[2][2][0][0]=v[104];
8517 Amat[2][2][0][1]=v[115];
8518 Amat[2][2][0][2]=v[128];
8519 Amat[2][2][1][0]=v[134];
8520 Amat[2][2][1][1]=v[141];
8521 Amat[2][2][1][2]=v[149];
8522 Amat[2][2][2][0]=v[152];
8523 Amat[2][2][2][1]=v[155];
8524 Amat[2][2][2][2]=v[156]+v[157]+v[35]+F[2][2]*v[80];
8540template <
class SC,
class LO,
class GO,
class NO>
8541void FE<SC,LO,GO,NO>::stvk2d(
double* v,
double (*lam),
double (*mue),
double** F
8542 ,
double** Pmat,
double**** Amat)
8544 v[43]=F[0][0]*F[1][0];
8545 v[42]=F[0][1]*F[1][1];
8546 v[37]=Power(F[0][0],2);
8548 v[36]=Power(F[0][1],2);
8549 v[34]=F[0][0]*F[0][1];
8551 v[27]=Power(F[1][0],2);
8552 v[31]=-1e0+v[27]+v[37];
8554 v[25]=Power(F[1][1],2);
8555 v[26]=-1e0+v[25]+v[36];
8556 v[23]=F[1][0]*F[1][1];
8558 v[35]=(*lam)*v[34]+(*mue)*(v[22]+v[34]);
8559 v[24]=(*lam)*v[23]+(*mue)*(v[22]+v[23]);
8560 v[21]=(*lam)*v[42]+2e0*(*mue)*(2e0*v[12]*v[14]+v[42]);
8561 v[20]=F[0][0]*F[1][1]*(*lam)+4e0*(*mue)*v[11]*v[14];
8563 v[30]=F[0][1]*F[1][0]*(*lam)+4e0*(*mue)*v[12]*v[13];
8564 v[29]=(*lam)*v[43]+2e0*(*mue)*(2e0*v[11]*v[13]+v[43]);
8566 v[32]=((*lam)*(v[26]+v[31]))/2e0;
8567 Pmat[0][0]=F[0][0]*v[32]+(*mue)*(F[0][0]*v[31]+v[11]*v[44]);
8568 Pmat[0][1]=F[0][1]*v[32]+(*mue)*(F[0][1]*v[26]+v[12]*v[44]);
8569 Pmat[1][0]=F[1][0]*v[32]+(*mue)*(F[1][0]*v[31]+v[13]*v[44]);
8570 Pmat[1][1]=F[1][1]*v[32]+(*mue)*(F[1][1]*v[26]+v[14]*v[44]);
8571 Amat[0][0][0][0]=v[32]+(*lam)*v[37]+(*mue)*(v[31]+v[36]+2e0*v[37]);
8572 Amat[0][0][0][1]=v[35];
8573 Amat[0][0][1][0]=v[29];
8574 Amat[0][0][1][1]=v[20];
8575 Amat[0][1][0][0]=v[35];
8576 Amat[0][1][0][1]=v[32]+(*lam)*v[36]+(*mue)*(v[26]+2e0*v[36]+v[37]);
8577 Amat[0][1][1][0]=v[30];
8578 Amat[0][1][1][1]=v[21];
8579 Amat[1][0][0][0]=v[29];
8580 Amat[1][0][0][1]=v[30];
8581 Amat[1][0][1][0]=(*lam)*v[27]+(*mue)*(v[25]+2e0*v[27]+v[31])+v[32];
8582 Amat[1][0][1][1]=v[24];
8583 Amat[1][1][0][0]=v[20];
8584 Amat[1][1][0][1]=v[21];
8585 Amat[1][1][1][0]=v[24];
8586 Amat[1][1][1][1]=(*lam)*v[25]+(*mue)*(2e0*v[25]+v[26]+v[27])+v[32];