52 #include "Amesos_Klu.h"
95 const double GLp_pi = 3.14159265358979323846;
116 const char geomFileBase[],
117 const bool trace =
true,
118 const bool dumpAll =
false
225 GLpYUEpetraDataPool::GLpYUEpetraDataPool(
245 if( myfile && myfile[0] !=
'\0' ) {
251 ,len_x,len_y,local_nx,local_ny,2
253 #ifdef GLPYUEPETRA_DATAPOOL_DUMP_ALL_MESH
254 ,&*Teuchos::VerboseObjectBase::getDefaultOStream(),
true
268 int * qintvalues =
new int[standardmap.NumMyElements()];
269 double * qdvalues =
new double[standardmap.NumMyElements()];
270 standardmap.MyGlobalElements(qintvalues);
271 for (
int i = 0; i < standardmap.NumMyElements(); i++)
273 q_->ReplaceGlobalValues(standardmap.NumMyElements(), qintvalues, qdvalues);
274 q_->GlobalAssemble();
536 yoverlap->Import(*y, Importer,
Insert);
547 yoverlap->Import(*y, Importer,
Insert);
561 int nummystates = standardmap.NumMyElements();
562 int nummycontrols = bdryctrlmap.NumMyElements();
569 standardmap.MyGlobalElements(states.
Values());
570 bdryctrlmap.MyGlobalElements(controls.
Values());
571 for (
int i=0; i<nummystates; i++) {
572 KKTmapindx(i) = states(i);
573 KKTmapindx(nummystates+nummycontrols+i) = 2*numstates+states(i);
575 for (
int i=0; i<nummycontrols; i++) {
576 KKTmapindx(nummystates+i) = numstates+controls(i);
587 for (
int i=0; i<nummystates+nummycontrols; i++) {
596 for (
int i=0; i<nummystates; i++) {
598 values.
Resize(nummyentries);
599 indices.
Resize(nummyentries);
602 if (nummyentries > 0)
606 values.
Resize(nummyentries);
607 indices.
Resize(nummyentries);
610 if (nummyentries > 0)
615 for (
int i=0; i<nummystates; i++) {
617 values.
Resize(nummyentries);
618 indices.
Resize(nummyentries);
621 for (
int j=0; j<nummyentries; j++)
622 indices[j] = indices[j]+numstates;
623 if (nummyentries > 0)
633 for (
int i=0; i<nummystates; i++) {
635 values.
Resize(nummyentries);
636 indices.
Resize(nummyentries);
639 for (
int j=0; j<nummyentries; j++)
640 indices[j] = indices[j]+2*numstates;
641 if (nummyentries > 0)
645 values.
Resize(nummyentries);
646 indices.
Resize(nummyentries);
649 for (
int j=0; j<nummyentries; j++)
650 indices[j] = indices[j]+2*numstates;
651 if (nummyentries > 0)
656 for (
int i=0; i<nummystates; i++) {
658 values.
Resize(nummyentries);
659 indices.
Resize(nummyentries);
662 for (
int j=0; j<nummyentries; j++)
663 indices[j] = indices[j]+2*numstates;
665 if (nummyentries > 0)
670 std::cout <<
"Insertion of entries failed:\n";
671 std::cout << indices;
672 std::cout << nummyentries << std::endl;
673 std::cout <<
"at row: " << KKTmapindx.
Values()[i]+numstates << std::endl << std::endl;
697 for (
int i=0; i<
Nodes.
M(); i++) {
704 for (
int i=0; i<
Nodes.
M(); i++) {
711 for (
int i=0; i<
Nodes.
M(); i++) {
720 S1(0,0)= 1.0;
S1(0,1)=-1.0;
S1(0,2)= 0.0;
721 S1(1,0)=-1.0;
S1(1,1)= 1.0;
S1(1,2)= 0.0;
722 S1(2,0)= 0.0;
S1(2,1)= 0.0;
S1(2,2)= 0.0;
724 S2(0,0)= 2.0;
S2(0,1)=-1.0;
S2(0,2)=-1.0;
725 S2(1,0)=-1.0;
S2(1,1)= 0.0;
S2(1,2)= 1.0;
726 S2(2,0)=-1.0;
S2(2,1)= 1.0;
S2(2,2)= 0.0;
728 S3(0,0)= 1.0;
S3(0,1)= 0.0;
S3(0,2)=-1.0;
729 S3(1,0)= 0.0;
S3(1,1)= 0.0;
S3(1,2)= 0.0;
730 S3(2,0)=-1.0;
S3(2,1)= 0.0;
S3(2,2)= 1.0;
738 for (
int i=0; i<3; i++) {
739 for (
int j=0; j<3; j++) {
748 for (
int i=0; i<3; i++) {
749 for (
int j=0; j<3; j++) {
750 for (
int k=0; k<3; k++) {
760 for (
int i=0; i<3; i++) {
761 for (
int j=0; j<3; j++) {
762 for (
int k=0; k<3; k++) {
772 for (
int i=0; i<3; i++) {
773 for (
int j=0; j<3; j++) {
774 for (
int k=0; k<3; k++) {
785 os <<
"\n\nQuadrature nodes:";
786 os <<
"\n-----------------";
788 os <<
"\n\nQuadrature weights:";
789 os <<
"\n-------------------\n";
791 os <<
"\n\nNodal basis functions:";
792 os <<
"\n----------------------";
794 os <<
"\n\nIntegrals of combinations of partial derivatives:";
795 os <<
"\n-------------------------------------------------";
799 os <<
"\n\nIntegrals of basis functions:";
800 os <<
"\n-----------------------------\n";
802 os <<
"\n\nIntegrals of products N(i)*N(j):";
803 os <<
"\n--------------------------------\n";
805 os <<
"\n\nIntegrals of products N(i)*N(j)*N(k):";
806 os <<
"\n-------------------------------------\n";
808 os <<
"\n\nIntegrals of products N(i)*(dN(j)/dx1)*N(k):";
809 os <<
"\n--------------------------------------------\n";
811 os <<
"\n\nIntegrals of products N(i)*(dN(j)/dx2)*N(k):";
812 os <<
"\n--------------------------------------------\n";
829 double *first,
double *second)
831 for (
int i=0; i<product.
M(); i++) {
832 product[i] = first[i]*second[i];
838 double *first,
double *second,
double *third)
840 for (
int i=0; i<product.
M(); i++) {
841 product[i] = first[i]*second[i]*third[i];
905 #ifdef GLPAPP_SHOW_BOUNDARY_ASSEMBLY
907 out = Teuchos::VerboseObjectBase::getDefaultOStream();
909 *out <<
"\nEntering assemble_bdry(...) ...\n";
912 int numLocElems = t.
M();
913 int numLocEdges = e.
M();
922 for (
int j=0; j<numLocEdges; j++) {
923 BdryNode[j] = e(j,0);
924 BdryNode[j+numLocEdges] = e(j,1);
926 std::sort(BdryNode.
Values(), BdryNode.
Values()+2*numLocEdges);
927 lastindx = std::unique(BdryNode.
Values(), BdryNode.
Values()+2*numLocEdges);
928 const int numBdryNodes = lastindx - BdryNode.
Values();
929 BdryNode.
Resize(numBdryNodes);
935 lastindx = std::set_intersection(
940 const int numMyBdryNodes = lastindx - MyBdryNode.
Values();
941 MyBdryNode.
Resize(numMyBdryNodes);
946 Epetra_Map standardmap(-1, ipindx.
M(),
const_cast<int*
>(ipindx.
A()), indexBase, Comm);
947 Epetra_Map overlapmap(-1, pindx.
M(),
const_cast<int*
>(pindx.
A()), indexBase, Comm);
948 Epetra_Map mybdryctrlmap(-1, numMyBdryNodes, const_cast<int*>(MyBdryNode.
A()), indexBase, Comm);
953 #ifdef GLPAPP_SHOW_BOUNDARY_ASSEMBLY
954 *out <<
"\nstandardmap:\n";
956 *out <<
"\nmybdryctrlmap:\n";
969 const int numNodesPerEdge = 2;
979 for(
int i=0; i < numLocEdges; i++ ) {
982 global_id_0 = e(i,0),
983 global_id_1 = e(i,1),
984 local_id_0 = overlapmap.
LID(global_id_0),
985 local_id_1 = overlapmap.
LID(global_id_1);
987 epetra_nodes(0) = global_id_0;
988 epetra_nodes(1) = global_id_1;
991 x0 = pcoords(local_id_0,0),
992 y0 = pcoords(local_id_0,1),
993 x1 = pcoords(local_id_1,0),
994 y1 = pcoords(local_id_1,1);
996 const double l = sqrt(pow(x0-x1,2) + pow(y0-y1,2));
999 const double l_sixth = l * (1.0/6.0);
1000 Bt(0,0) = l_sixth * 2.0;
1001 Bt(0,1) = l_sixth * 1.0;
1002 Bt(1,0) = l_sixth * 1.0;
1003 Bt(1,1) = l_sixth * 2.0;
1005 #ifdef GLPAPP_SHOW_BOUNDARY_ASSEMBLY
1007 <<
"\nEdge global nodes = ("<<global_id_0<<
","<<global_id_1<<
"),"
1008 <<
" local nodes = ("<<local_id_0<<
","<<local_id_1<<
"),"
1009 <<
" (x0,y0)(x1,y1)=("<<x0<<
","<<y0<<
")("<<x1<<
","<<y1<<
"),"
1010 <<
" Bt = ["<<Bt(0,0)<<
","<<Bt(0,1)<<
";"<<Bt(1,0)<<
","<<Bt(1,1)<<
"]\n";
1015 if (err<0)
return(err);
1016 err = R->InsertGlobalValues(epetra_nodes,Bt,format);
1017 if (err<0)
return(err);
1036 if (err<0)
return(err);
1037 err = R->GlobalAssemble(mybdryctrlmap,mybdryctrlmap,
true);
1038 if (err<0)
return(err);
1040 if(B_out) *B_out = B;
1041 if(R_out) *R_out = R;
1043 #ifdef GLPAPP_SHOW_BOUNDARY_ASSEMBLY
1046 *out <<
"\nLeaving assemble_bdry(...) ...\n";
1116 RCP<Epetra_FECrsMatrix> &
A,
1117 RCP<Epetra_FECrsMatrix> & M,
1118 RCP<Epetra_FEVector> & b)
1121 int myPID = Comm.
MyPID();
1122 int numProcs = Comm.
NumProc();
1125 int numLocElems = t.
M();
1126 int numNodesPerElem = 3;
1130 Epetra_Map standardmap(-1, ipindx.
M(), (
int*)ipindx.
A(), indexBase, Comm);
1131 Epetra_Map overlapmap(-1, pindx.
M(), (
int*)pindx.
A(), indexBase, Comm);
1133 int* nodes =
new int[numNodesPerElem];
1134 int i=0, j=0, err=0;
1151 for (i=0; i< numNodesPerElem; i++) k(i)=1.0;
1153 for (i=0; i< numNodesPerElem; i++) { c(i,0)=0.0; c(i,1)=0.0; }
1155 for (i=0; i< numNodesPerElem; i++) r(i)=0.0;
1157 for (i=0; i< numNodesPerElem; i++) f(i)=0.0;
1161 sigma(0)=0.0; sigma(1)=0.0;
1162 for(i=0; i<numLocElems; i++) {
1163 nodes[0] = t(i,0); nodes[1] = t(i,1); nodes[2] = t(i,2);
1164 for (j=0; j<numNodesPerElem; j++) {
1166 vertices(j,0) = pcoords(overlapmap.LID(nodes[j]), 0);
1167 vertices(j,1) = pcoords(overlapmap.LID(nodes[j]), 1);
1169 f(j) = cos(
GLp_pi*vertices(j,0))*cos(
GLp_pi*vertices(j,1)) *
1172 lassembly(vertices, k, c, r, f, usr_par, At, bt);
1173 err = A->InsertGlobalValues(epetra_nodes, At, format);
1174 if (err<0)
return(err);
1175 err = b->SumIntoGlobalValues(epetra_nodes, bt);
1176 if (err<0)
return(err);
1184 for (i=0; i<e.
M(); i++) {
1186 neumann(j,0) = e(i,0); neumann(j,1) = e(i,1);
1190 neumann.Reshape(j,2);
1192 if (neumann.M() != 0) {
1205 N.
Shape(quadnodes.
M(),2);
1206 for (i=0; i<quadnodes.
M(); i++) {
1207 N(i,0) = 1.0 - quadnodes(i,0);
1208 N(i,1) = quadnodes(i,0);
1213 for (i=0; i<2; i++) {
1214 for (j=0; j<2; j++) {
1216 NN(i,j) = blas.
DOT(quadweights.
M(), quadweights.
A(), product.
A());
1223 for (i=0; i<neumann.M(); i++) {
1224 neumann_nodes(0) = neumann(i,0); neumann_nodes(1) = neumann(i,1);
1225 neumann_add(0) = pcoords(overlapmap.LID(neumann_nodes(0)),0)
1226 -pcoords(overlapmap.LID(neumann_nodes(1)),0);
1227 neumann_add(1) = pcoords(overlapmap.LID(neumann_nodes(0)),1)
1228 -pcoords(overlapmap.LID(neumann_nodes(1)),1);
1229 l = blas.
NRM2(neumann_add.
M(), neumann_add.
A());
1230 neumann_add.
Multiply(
'N',
'N', 1.0, NN, g, 0.0);
1231 neumann_add.
Scale(l);
1232 err = b->SumIntoGlobalValues(neumann_nodes, neumann_add);
1233 if (err<0)
return(err);
1240 for (i=0; i<e.
M(); i++) {
1242 robin(j,0) = e(i,0); robin(j,1) = e(i,1);
1248 if (robin.M() != 0) {
1262 N.
Shape(quadnodes.
M(),2);
1263 for (i=0; i<quadnodes.
M(); i++) {
1264 N(i,0) = 1.0 - quadnodes(i,0);
1265 N(i,1) = quadnodes(i,0);
1270 for (i=0; i<2; i++) {
1271 for (j=0; j<2; j++) {
1273 NN(i,j) = blas.
DOT(quadweights.
M(), quadweights.
A(), product.
A());
1280 for (i=0; i<2; i++) {
1281 for (j=0; j<2; j++) {
1282 for (
int k=0; k<2; k++) {
1284 NNN[k](i,j) = blas.
DOT(quadweights.
M(), quadweights.
A(),
1294 for (i=0; i<robin.M(); i++) {
1295 robin_nodes(0) = robin(i,0); robin_nodes(1) = robin(i,1);
1297 robin_b_add(0) = pcoords(overlapmap.LID(robin_nodes(0)),0)
1298 -pcoords(overlapmap.LID(robin_nodes(1)),0);
1299 robin_b_add(1) = pcoords(overlapmap.LID(robin_nodes(0)),1)
1300 -pcoords(overlapmap.LID(robin_nodes(1)),1);
1301 l = blas.
NRM2(robin_b_add.
M(), robin_b_add.
A());
1302 robin_b_add.
Multiply(
'N',
'N', 1.0, NN, g, 0.0);
1303 robin_b_add.
Scale(l);
1304 err = b->SumIntoGlobalValues(robin_nodes, robin_b_add);
1305 if (err<0)
return(err);
1307 NNN[0].
Scale(sigma(0)); NNN[1].
Scale(sigma(1));
1308 robin_A_add += NNN[0]; robin_A_add += NNN[1];
1309 robin_A_add.
Scale(l);
1310 err = A->InsertGlobalValues(robin_nodes, robin_A_add, format);
1311 if (err<0)
return(err);
1320 for (i=0; i<e.
M(); i++) {
1322 dirichlet(j,0) = e(i,0); dirichlet(j,1) = e(i,1);
1326 dirichlet.Reshape(j,2);
1337 for (i=0; i< numNodesPerElem; i++) k(i)=0.0;
1338 for (i=0; i< numNodesPerElem; i++) { c(i,0)=0.0; c(i,1)=0.0; }
1339 for (i=0; i< numNodesPerElem; i++) r(i)=1.0;
1340 for (i=0; i< numNodesPerElem; i++) f(i)=0.0;
1342 sigma(0)=0.0; sigma(1)=0.0;
1343 for(i=0; i<numLocElems; i++) {
1344 nodes[0] = t(i,0); nodes[1] = t(i,1); nodes[2] = t(i,2);
1345 for (j=0; j<numNodesPerElem; j++) {
1346 vertices(j,0) = pcoords(overlapmap.LID(nodes[j]), 0);
1347 vertices(j,1) = pcoords(overlapmap.LID(nodes[j]), 1);
1349 lassembly(vertices, k, c, r, f, usr_par, Mt, bt);
1350 err = M->InsertGlobalValues(epetra_nodes, Mt, format);
1351 if (err<0)
return(err);
1360 err = A->GlobalAssemble();
1361 if (err<0)
return(err);
1363 err = b->GlobalAssemble();
1364 if (err<0)
return(err);
1366 err = M->GlobalAssemble();
1367 if (err<0)
return(err);
1437 for(
int i=0; i<2; i++) {
1438 B(i,0) = vertices(1,i)-vertices(0,i);
1439 B(i,1) = vertices(2,i)-vertices(0,i);
1445 BtB.
Multiply(
'T',
'N', 1.0, B, B, 0.0);
1451 tmp = usr_par.
S1; tmp.
Scale(C(0,0));
1453 tmp = usr_par.
S2; tmp.
Scale(C(0,1));
1455 tmp = usr_par.
S3; tmp.
Scale(C(1,1));
1457 M1.
Scale( (k(0)*usr_par.
Nw(0) + k(1)*usr_par.
Nw(1) +
1458 k(2)*usr_par.
Nw(2)) * adB );
1461 tmp = usr_par.
NdNdx1Nw[0]; tmp.
Scale(b(0,0)*c(0,0)+b(0,1)*c(0,1));
1463 tmp = usr_par.
NdNdx1Nw[1]; tmp.
Scale(b(0,0)*c(1,0)+b(0,1)*c(1,1));
1465 tmp = usr_par.
NdNdx1Nw[2]; tmp.
Scale(b(0,0)*c(2,0)+b(0,1)*c(2,1));
1467 tmp = usr_par.
NdNdx2Nw[0]; tmp.
Scale(b(1,0)*c(0,0)+b(1,1)*c(0,1));
1469 tmp = usr_par.
NdNdx2Nw[1]; tmp.
Scale(b(1,0)*c(1,0)+b(1,1)*c(1,1));
1471 tmp = usr_par.
NdNdx2Nw[2]; tmp.
Scale(b(1,0)*c(2,0)+b(1,1)*c(2,1));
1512 lapack.
GETRF(dim, dim, inv.
A(), dim, ipiv.
A(), &info);
1513 lapack.
GETRI(dim, inv.
A(), dim, ipiv.
A(), work.
A(), &dim, &info);
1535 lapack.
GETRF(dim, dim, mymat.
A(), dim, ipiv.
A(), &info);
1538 for (
int i=0; i<dim; i++) {
1543 for (
int i=0; i<dim; i++) {
1544 if ((ipiv[i]-1) != i)
1548 det *= pow((
double)(-1.0),swaps);
1560 const char geomFileBase[],
1565 int MyPID = Comm.
MyPID();
1567 const int FileNameSize = 120;
1568 char FileName[FileNameSize];
1570 sprintf(FileName,
"%s.%03d", geomFileBase, MyPID);
1573 std::ifstream file_in(FileName);
1575 file_in.eof(), std::logic_error
1576 ,
"Error, the file \""<<FileName<<
"\" could not be opened for input!"
1581 fid = fopen(FileName,
"r");
1583 if(trace) printf(
"\nReading node info from %s ...\n", FileName);
1584 int numip = 0, numcp = 0;
1585 fscanf(fid,
"%d %d", &numip, &numcp);
1586 const int nump = numip + numcp;
1587 if(trace) printf(
"\nnumip = %d, numcp = %d, nump = %d\n", numip, numcp, nump );
1589 ipcoords.
Shape(numip, 2);
1591 pcoords.
Shape(nump, 2);
1592 for (
int i=0; i<numip; i++) {
1593 fscanf(fid,
"%d %lf %lf %*d",&ipindx(i),&ipcoords(i,0),&ipcoords(i,1));
1594 if(trace&&dumpAll) printf(
"%d %lf %lf\n",ipindx(i),ipcoords(i,0),ipcoords(i,1));
1595 pindx(i) = ipindx(i);
1596 pcoords(i,0) = ipcoords(i,0); pcoords(i,1) = ipcoords(i,1);
1598 for (
int i=numip; i<nump; i++) {
1599 fscanf(fid,
"%d %lf %lf %*d",&pindx(i),&pcoords(i,0),&pcoords(i,1));
1602 fscanf(fid,
"%*[^\n]");
1603 fscanf(fid,
"%*1[\n]");
1605 fscanf(fid,
"%*[^\n]");
1606 fscanf(fid,
"%*1[\n]");
1608 for (
int i=0; i<nump; i++) {
1609 fscanf(fid,
"%*[^\n]");
1610 fscanf(fid,
"%*1[\n]");
1613 if(trace) printf(
"\nReading element info from %s ...\n", FileName);
1615 fscanf(fid,
"%d", &numelems);
1616 if(trace) printf(
"\nnumelems = %d\n", numelems );
1617 t.
Shape(numelems,3);
1618 for (
int i=0; i<numelems; i++) {
1619 fscanf(fid,
"%d %d %d", &t(i,0), &t(i,1), &t(i,2));
1620 if(trace&&dumpAll) printf(
"%d %d %d\n", t(i,0), t(i,1), t(i,2));
1623 if(trace) printf(
"\nReading boundry edge info from %s ...\n", FileName);
1625 fscanf(fid,
"%d",&numedges);
1626 if(trace) printf(
"\nnumedges = %d\n", numedges );
1627 e.
Shape(numedges,3);
1628 for (
int i=0; i<numedges; i++) {
1629 fscanf(fid,
"%d %d %d", &e(i,0), &e(i,1), &e(i,2));
1630 if(trace&&dumpAll) printf(
"%d %d %d\n", e(i,0), e(i,1), e(i,2));
1634 if(trace) printf(
"Done reading mesh.\n");
1688 int myPID = Comm.
MyPID();
1689 int numProcs = Comm.
NumProc();
1691 int numLocNodes = pindx.
M();
1692 int numMyLocNodes = ipindx.
M();
1693 int numLocElems = t.
M();
1694 int numNodesPerElem = 3;
1698 Epetra_Map standardmap(-1, numMyLocNodes, (
int*)ipindx.
A(), indexBase, Comm);
1699 Epetra_Map overlapmap(-1, numLocNodes, (
int*)pindx.
A(), indexBase, Comm);
1703 int* nodes =
new int[numNodesPerElem];
1704 int i=0, j=0, err=0;
1710 int numQuadPts = Nodes.
M();
1715 N.
Shape(numQuadPts,3);
1716 for (
int i=0; i<numQuadPts; i++) {
1717 N(i,0) = 1.0 - Nodes(i,0) - Nodes(i,1);
1718 N(i,1) = Nodes(i,0);
1719 N(i,2) = Nodes(i,1);
1737 ly.
Size(numNodesPerElem);
1738 Nly.
Size(numQuadPts);
1739 ls.
Size(numNodesPerElem);
1740 Nls.
Size(numQuadPts);
1741 llambda.
Size(numNodesPerElem);
1742 Nllambda.
Size(numQuadPts);
1743 lgfctn.
Size(numQuadPts);
1744 lgfctnNi.
Size(numQuadPts);
1745 lgfctnNls.
Size(numQuadPts);
1746 lhessvec.
Size(numNodesPerElem);
1751 for(i=0; i<numLocElems; i++) {
1753 nodes[0] = t(i,0); nodes[1] = t(i,1); nodes[2] = t(i,2);
1754 for (j=0; j<numNodesPerElem; j++) {
1755 vertices(j,0) = pcoords(overlapmap.LID(nodes[j]), 0);
1756 vertices(j,1) = pcoords(overlapmap.LID(nodes[j]), 1);
1760 for(
int i=0; i<2; i++) {
1761 B(i,0) = vertices(1,i)-vertices(0,i);
1762 B(i,1) = vertices(2,i)-vertices(0,i);
1767 for (j=0; j<numNodesPerElem; j++) {
1768 ly(j) = (*((*y)(0)))[overlapmap.LID(nodes[j])];
1769 ls(j) = (*((*s)(0)))[overlapmap.LID(nodes[j])];
1770 llambda(j) = (*((*lambda)(0)))[overlapmap.LID(nodes[j])];
1773 Nly.
Multiply(
'N',
'N', 1.0, N, ly, 0.0);
1774 Nls.
Multiply(
'N',
'N', 1.0, N, ls, 0.0);
1775 Nllambda.
Multiply(
'N',
'N', 1.0, N, llambda, 0.0);
1778 for (
int i=0; i<numNodesPerElem; i++) {
1781 lhessvec(i) = adB*lgfctnNls.
Dot(Weights);
1784 err = hessvec->SumIntoGlobalValues(epetra_nodes, lhessvec);
1785 if (err<0)
return(err);
1790 err = hessvec->GlobalAssemble();
1791 if (err<0)
return(err);
1803 for (
int i=0; i<v.
M(); i++) {
1850 int myPID = Comm.
MyPID();
1851 int numProcs = Comm.
NumProc();
1853 int numLocNodes = pindx.
M();
1854 int numMyLocNodes = ipindx.
M();
1855 int numLocElems = t.
M();
1856 int numNodesPerElem = 3;
1860 Epetra_Map standardmap(-1, numMyLocNodes, (
int*)ipindx.
A(), indexBase, Comm);
1861 Epetra_Map overlapmap(-1, numLocNodes, (
int*)pindx.
A(), indexBase, Comm);
1866 int* nodes =
new int[numNodesPerElem];
1867 int i=0, j=0, err=0;
1873 int numQuadPts = Nodes.
M();
1878 N.
Shape(numQuadPts,3);
1879 for (
int i=0; i<numQuadPts; i++) {
1880 N(i,0) = 1.0 - Nodes(i,0) - Nodes(i,1);
1881 N(i,1) = Nodes(i,0);
1882 N(i,2) = Nodes(i,1);
1895 ly.Size(numNodesPerElem);
1896 Nly.
Size(numQuadPts);
1897 lgfctn.
Size(numQuadPts);
1898 lgfctnNiNj.
Size(numQuadPts);
1899 lGp.
Shape(numNodesPerElem, numNodesPerElem);
1904 for(i=0; i<numLocElems; i++) {
1906 nodes[0] = t(i,0); nodes[1] = t(i,1); nodes[2] = t(i,2);
1907 for (j=0; j<numNodesPerElem; j++) {
1908 vertices(j,0) = pcoords(overlapmap.LID(nodes[j]), 0);
1909 vertices(j,1) = pcoords(overlapmap.LID(nodes[j]), 1);
1913 for(
int i=0; i<2; i++) {
1914 B(i,0) = vertices(1,i)-vertices(0,i);
1915 B(i,1) = vertices(2,i)-vertices(0,i);
1920 for (j=0; j<numNodesPerElem; j++) {
1921 ly(j) = (*((*y)(0)))[overlapmap.LID(nodes[j])];
1924 Nly.
Multiply(
'N',
'N', 1.0, N, ly, 0.0);
1927 for (
int i=0; i<numNodesPerElem; i++) {
1928 for (
int j=0; j<numNodesPerElem; j++) {
1930 lGp(i,j) = adB*lgfctnNiNj.
Dot(Weights);
1935 if (err<0)
return(err);
1941 if (err<0)
return(err);
1953 for (
int i=0; i<v.
M(); i++) {
1954 gv(i) = 3.0*pow(v(i),2)-1.0;
2000 int myPID = Comm.
MyPID();
2001 int numProcs = Comm.
NumProc();
2003 int numLocNodes = pindx.
M();
2004 int numMyLocNodes = ipindx.
M();
2005 int numLocElems = t.
M();
2006 int numNodesPerElem = 3;
2010 Epetra_Map standardmap(-1, numMyLocNodes, (
int*)ipindx.
A(), indexBase, Comm);
2011 Epetra_Map overlapmap(-1, numLocNodes, (
int*)pindx.
A(), indexBase, Comm);
2015 int* nodes =
new int[numNodesPerElem];
2016 int i=0, j=0, err=0;
2022 int numQuadPts = Nodes.
M();
2027 N.
Shape(numQuadPts,3);
2028 for (
int i=0; i<numQuadPts; i++) {
2029 N(i,0) = 1.0 - Nodes(i,0) - Nodes(i,1);
2030 N(i,1) = Nodes(i,0);
2031 N(i,2) = Nodes(i,1);
2044 ly.
Size(numNodesPerElem);
2045 Nly.
Size(numQuadPts);
2046 lgfctn.
Size(numQuadPts);
2047 lgfctnNi.
Size(numQuadPts);
2048 lg.
Size(numNodesPerElem);
2053 for(i=0; i<numLocElems; i++) {
2055 nodes[0] = t(i,0); nodes[1] = t(i,1); nodes[2] = t(i,2);
2056 for (j=0; j<numNodesPerElem; j++) {
2057 vertices(j,0) = pcoords(overlapmap.LID(nodes[j]), 0);
2058 vertices(j,1) = pcoords(overlapmap.LID(nodes[j]), 1);
2062 for(
int i=0; i<2; i++) {
2063 B(i,0) = vertices(1,i)-vertices(0,i);
2064 B(i,1) = vertices(2,i)-vertices(0,i);
2069 for (j=0; j<numNodesPerElem; j++) {
2070 ly(j) = (*((*y)(0)))[overlapmap.LID(nodes[j])];
2073 Nly.
Multiply(
'N',
'N', 1.0, N, ly, 0.0);
2076 for (
int i=0; i<numNodesPerElem; i++) {
2078 lg(i) = adB*lgfctnNi.
Dot(Weights);
2081 err = g->SumIntoGlobalValues(epetra_nodes, lg);
2082 if (err<0)
return(err);
2087 err = g->GlobalAssemble();
2088 if (err<0)
return(err);
2101 for (
int i=0; i<v.
M(); i++) {
2102 gv(i) = pow(v(i),3)-v(i);
2136 std::cerr <<
"ERROR in "<< __FILE__ <<
", line " << __LINE__ << std::endl;
2137 std::cerr <<
"Function CrsMatrix2MATLAB accepts\n";
2138 std::cerr <<
"transformed matrices ONLY. Please call A.TransformToLoca()\n";
2139 std::cerr <<
"on your matrix A to that purpose.\n";
2140 std::cerr <<
"Now returning...\n";
2150 int NumGlobalNonzeros;
2158 if( IndexBase == 0 )
2160 else if ( IndexBase == 1)
2166 outfile <<
"A = spalloc(";
2167 outfile << NumGlobalRows <<
',' << NumGlobalRows;
2168 outfile <<
',' << NumGlobalNonzeros <<
");\n";
2171 for(
int Proc=0 ; Proc<NumProc ; ++Proc ) {
2173 if( MyPID == Proc ) {
2175 outfile <<
"\n\n% On proc " << Proc <<
": ";
2176 outfile << NumMyRows <<
" rows and ";
2180 for(
int MyRow=0 ; MyRow<NumMyRows ; ++MyRow ) {
2182 GlobalRow = A.
GRID(MyRow);
2185 double *Values =
new double[NumNzRow];
2186 int *Indices =
new int[NumNzRow];
2189 NumEntries, Values, Indices);
2191 for(
int j=0 ; j<NumEntries ; ++j ) {
2192 outfile <<
"A(" << GlobalRow + IndexBase
2193 <<
"," << A.
GCID(Indices[j]) + IndexBase
2194 <<
") = " << Values[j] <<
";\n";
2232 int MyPID = v.Comm().MyPID();
2233 int NumProc = v.Comm().NumProc();
2234 int MyLength = v.MyLength();
2235 int GlobalLength = v.GlobalLength();
2241 if( MyPID == 0 ) outfile <<
"v = zeros(" << GlobalLength <<
",1)\n";
2250 if( IndexBase == 0 )
2252 else if ( IndexBase == 1)
2255 for(
int Proc=0 ; Proc<NumProc ; ++Proc ) {
2257 if( MyPID == Proc ) {
2259 outfile <<
"% On proc " << Proc <<
": ";
2260 outfile << MyLength <<
" rows of ";
2261 outfile << GlobalLength <<
" elements\n";
2263 for( Row=0 ; Row<MyLength ; ++Row ) {
2264 outfile <<
"v(" << MyGlobalElements[Row] + IndexBase
2265 <<
") = " << v[Row] <<
";\n";
2300 int MyPID = v.Comm().MyPID();
2301 int NumProc = v.Comm().NumProc();
2309 if( MyPID == 0 ) outfile <<
"v = zeros(" << GlobalLength <<
",1)\n";
2318 if( IndexBase == 0 )
2320 else if ( IndexBase == 1)
2323 for(
int Proc=0 ; Proc<NumProc ; ++Proc ) {
2325 if( MyPID == Proc ) {
2327 outfile <<
"% On proc " << Proc <<
": ";
2328 outfile << MyLength <<
" rows of ";
2329 outfile << GlobalLength <<
" elements\n";
2331 for( Row=0 ; Row<MyLength ; ++Row ) {
2332 outfile <<
"v(" << MyGlobalElements[Row] + IndexBase
2333 <<
") = " << v[0][Row] <<
";\n";
2373 else if (order == 2) {
2375 nodes(0,0) = (1.0-1.0/sqrt(3.0))/2.0;
2376 nodes(1,0) = (1.0+1.0/sqrt(3.0))/2.0;
2381 else if (order == 3) {
2383 nodes(0,0) = (1.0-sqrt(3.0/5.0))/2.0;
2385 nodes(2,0) = (1.0+sqrt(3.0/5.0))/2.0;
2387 weights(0) = 5.0/18.0;
2388 weights(1) = 4.0/9.0;
2389 weights(2) = 5.0/18.0;
2392 std::cout <<
"Quadrature for dim = " << dim <<
" and order = ";
2393 std::cout << order <<
" not available.\n";
2398 else if (dim == 2) {
2405 nodes(0,0) = 1.0/3.0; nodes (0,1) = 1.0/3.0;
2409 else if (order == 2) {
2411 nodes(0,0) = 1.0/6.0; nodes (0,1) = 1.0/6.0;
2412 nodes(1,0) = 2.0/3.0; nodes (1,1) = 1.0/6.0;
2413 nodes(2,0) = 1.0/6.0; nodes (2,1) = 2.0/3.0;
2415 weights(0) = 1.0/6.0;
2416 weights(1) = 1.0/6.0;
2417 weights(2) = 1.0/6.0;
2419 else if (order == 3) {
2421 nodes(0,0) = 1.0/3.0; nodes (0,1) = 1.0/3.0;
2422 nodes(1,0) = 3.0/5.0; nodes (1,1) = 1.0/5.0;
2423 nodes(2,0) = 1.0/5.0; nodes (2,1) = 3.0/5.0;
2424 nodes(3,0) = 1.0/5.0; nodes (3,1) = 1.0/5.0;
2426 weights(0) = -9.0/32.0;
2427 weights(1) = 25.0/96.0;
2428 weights(2) = 25.0/96.0;
2429 weights(3) = 25.0/96.0;
2432 std::cout <<
"Quadrature for dim = " << dim <<
" and order = ";
2433 std::cout << order <<
" not available.\n";
2439 std::cout <<
"Quadrature for dim = " << dim <<
" not available.\n";
Teuchos::RCP< Epetra_FEVector > Ny_
Teuchos::RCP< Epetra_FECrsMatrix > getR()
int NumGlobalElements() const
Teuchos::RCP< Epetra_FEVector > getq()
Teuchos::RCP< const Epetra_Comm > commptr_
Teuchos::RCP< Epetra_FEVector > b_
Right-hand side of the PDE.
Teuchos::RCP< const Epetra_IntSerialDenseVector > getpindx()
double beta_
Regularization parameter.
void PrintVec(const Teuchos::RCP< const Epetra_Vector > &x)
Outputs the solution vector to files.
int Resize(int Length_in)
Epetra_SerialDenseMatrix NNw
int NumMyEntries(int Row) const
int Shape(int NumRows, int NumCols)
Teuchos::RCP< const Epetra_IntSerialDenseMatrix > gett()
void computeNpy(const Teuchos::RCP< const Epetra_MultiVector > &y)
Calls the function that computes the Jacobian of the nonlinear term.
Epetra_SerialDenseMatrix Nx2
int ExtractGlobalRowCopy(int_type Row, int Length, int &NumEntries, double *values, int_type *Indices) const
float NRM2(const int N, const float *X, const int INCX=1) const
Epetra_SerialDenseMatrix * NdNdx2Nw
Teuchos::RCP< Epetra_CrsMatrix > Augmat_
Augmented system matrix: [ I Jac* ] [Jac 0 ].
int MyGlobalElements(int *MyGlobalElementList) const
virtual void Print(std::ostream &os) const
int nonlinjac(const Epetra_Comm &, const Epetra_IntSerialDenseVector &, const Epetra_SerialDenseMatrix &, const Epetra_IntSerialDenseVector &, const Epetra_SerialDenseMatrix &, const Epetra_IntSerialDenseMatrix &, const Teuchos::RCP< const Epetra_MultiVector > &, Teuchos::RCP< Epetra_FECrsMatrix > &)
int NumGlobalRows() const
Epetra_SerialDenseMatrix S3
virtual int InsertGlobalValues(int GlobalRow, int NumEntries, const double *Values, const int *Indices)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
void computeNy(const Teuchos::RCP< const Epetra_MultiVector > &y)
Calls the function that computes the nonlinear term.
void gfctn(const Epetra_SerialDenseVector &, Epetra_SerialDenseVector &)
bool Vector2MATLAB(const Epetra_Vector &, std::ostream &)
Epetra_SerialDenseVector Weights
bool FEVector2MATLAB(const Epetra_FEVector &, std::ostream &)
int nonlinvec(const Epetra_Comm &, const Epetra_IntSerialDenseVector &, const Epetra_SerialDenseMatrix &, const Epetra_IntSerialDenseVector &, const Epetra_SerialDenseMatrix &, const Epetra_IntSerialDenseMatrix &, const Teuchos::RCP< const Epetra_MultiVector > &, Teuchos::RCP< Epetra_FEVector > &)
Teuchos::RCP< Epetra_FECrsMatrix > A_
Volume stiffness matrix.
Epetra_SerialDenseMatrix S1
Teuchos::RCP< const Epetra_IntSerialDenseMatrix > gete()
int meshreader(const Epetra_Comm &, Epetra_IntSerialDenseVector &, Epetra_SerialDenseMatrix &, Epetra_IntSerialDenseVector &, Epetra_SerialDenseMatrix &, Epetra_IntSerialDenseMatrix &, Epetra_IntSerialDenseMatrix &, const char geomFileBase[], const bool trace=true, const bool dumpAll=false)
double determinant(const Epetra_SerialDenseMatrix &)
Provides the interface to generic abstract vector libraries.
void Print(std::ostream &os) const
bool IndicesAreLocal() const
virtual void Barrier() const =0
Teuchos::RCP< Epetra_FECrsMatrix > getNpy()
ostream & operator<<(ostream &os, const pair< Packet, Packet > &arg)
Transform to form the explicit transpose of a Epetra_RowMatrix.
Teuchos::RCP< Epetra_IntSerialDenseMatrix > t_
Elements (this includes all overlapping nodes).
void gpfctn(const Epetra_SerialDenseVector &v, Epetra_SerialDenseVector &gv)
Teuchos::RCP< Epetra_SerialDenseMatrix > pcoords_
Coordinates of all nodes in this subdomain.
virtual int MyPID() const =0
int FillComplete(bool OptimizeDataStorage=true)
int Resize(int Length_in)
int InsertGlobalValues(int GlobalRow, int NumEntries, const double *Values, const int *Indices)
void GETRF(const int M, const int N, float *A, const int LDA, int *IPIV, int *INFO) const
Epetra_SerialDenseMatrix S2
virtual void Print(std::ostream &os) const
void rect2DMeshGenerator(const int numProc, const int procRank, const double len_x, const double len_y, const int local_nx, const int local_ny, const int bndy_marker, Epetra_IntSerialDenseVector *ipindx_out, Epetra_SerialDenseMatrix *ipcoords_out, Epetra_IntSerialDenseVector *pindx_out, Epetra_SerialDenseMatrix *pcoords_out, Epetra_IntSerialDenseMatrix *t_out, Epetra_IntSerialDenseMatrix *e_out, std::ostream *out, const bool dumpAll)
Generate a simple rectangular 2D triangular mesh that is only partitioned between processors in the y...
Epetra_SerialDenseMatrix * NdNdx1Nw
int NumMyElements() const
Teuchos::RCP< Epetra_FECrsMatrix > Npy_
Jacobian of the nonlinear term.
Teuchos::RCP< Epetra_FECrsMatrix > R_
Edge mass matrix.
void computeAugmat()
Assembles the augmented system (KKT-type) matrix.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Teuchos::RCP< const Epetra_SerialDenseMatrix > getpcoords()
int assemble_bdry(const Epetra_Comm &Comm, const Epetra_IntSerialDenseVector &ipindx, const Epetra_SerialDenseMatrix &ipcoords, const Epetra_IntSerialDenseVector &pindx, const Epetra_SerialDenseMatrix &pcoords, const Epetra_IntSerialDenseMatrix &t, const Epetra_IntSerialDenseMatrix &e, Teuchos::RCP< Epetra_FECrsMatrix > *B, Teuchos::RCP< Epetra_FECrsMatrix > *R)
int assemblyFECrs(const Epetra_Comm &, const Epetra_IntSerialDenseVector &, const Epetra_SerialDenseMatrix &, const Epetra_IntSerialDenseVector &, const Epetra_SerialDenseMatrix &, const Epetra_IntSerialDenseMatrix &, const Epetra_IntSerialDenseMatrix &, Teuchos::RCP< Epetra_FECrsMatrix > &, Teuchos::RCP< Epetra_FEVector > &)
int ExtractGlobalRowCopy(int GlobalRow, int Length, int &NumEntries, double *Values, int *Indices) const
T_To & dyn_cast(T_From &from)
Teuchos::RCP< Epetra_FECrsMatrix > B_
Control/state mass matrix.
void g2pfctn(const Epetra_SerialDenseVector &, Epetra_SerialDenseVector &)
virtual const Epetra_BlockMap & Map() const =0
int compproduct(Epetra_SerialDenseVector &, double *, double *)
Teuchos::RCP< Epetra_SerialDenseMatrix > ipcoords_
Coordinates of nodes that are unique to this subdomain.
int GlobalAssemble(bool callFillComplete=true, Epetra_CombineMode combineMode=Add, bool save_off_and_reuse_map_exporter=false)
int lassembly(const Epetra_SerialDenseMatrix &, const Epetra_SerialDenseVector &, const Epetra_SerialDenseMatrix &, const Epetra_SerialDenseVector &, const Epetra_SerialDenseVector &, const Usr_Par &, Epetra_SerialDenseMatrix &, Epetra_SerialDenseVector &)
Teuchos::RCP< const Epetra_IntSerialDenseVector > getipindx()
Teuchos::RCP< Epetra_FECrsMatrix > getH()
virtual void Print(std::ostream &os) const
int NumGlobalNonzeros() const
Teuchos::RCP< const Epetra_SerialDenseMatrix > getipcoords()
void computeAll(const GenSQP::Vector &x)
Calls functions to compute nonlinear quantities and the augmented system matrix.
Teuchos::RCP< Epetra_FECrsMatrix > getB()
void GETRI(const int N, float *A, const int LDA, int *IPIV, float *WORK, const int *LWORK, int *INFO) const
int nonlinhessvec(const Epetra_Comm &, const Epetra_IntSerialDenseVector &, const Epetra_SerialDenseMatrix &, const Epetra_IntSerialDenseVector &, const Epetra_SerialDenseMatrix &, const Epetra_IntSerialDenseMatrix &, const Teuchos::RCP< const Epetra_MultiVector > &, const Teuchos::RCP< const Epetra_MultiVector > &, const Teuchos::RCP< const Epetra_MultiVector > &, Teuchos::RCP< Epetra_FEVector > &)
Teuchos::RCP< Epetra_FEVector > q_
The desired state.
Teuchos::RCP< Epetra_FECrsMatrix > getA()
Epetra_SerialDenseMatrix Nodes
int Scale(double ScalarA)
Teuchos::RCP< Epetra_IntSerialDenseVector > pindx_
Global nodes (interior + shared, overlapping) in this subdomain.
virtual void Print(std::ostream &os) const
int Multiply(char TransA, char TransB, double ScalarAB, const Epetra_SerialDenseMatrix &A, const Epetra_SerialDenseMatrix &B, double ScalarThis)
virtual int NumProc() const =0
int GRID(int LRID_in) const
Teuchos::RCP< Epetra_CrsMatrix > getAugmat()
bool CrsMatrix2MATLAB(const Epetra_CrsMatrix &, std::ostream &)
Epetra_SerialDenseMatrix Nx1
const Epetra_Map & DomainMap() const
Epetra_SerialDenseVector Nw
Epetra_SerialDenseMatrix * NNNw
int solveAugsys(const Teuchos::RCP< const Epetra_MultiVector > &rhsy, const Teuchos::RCP< const Epetra_MultiVector > &rhsu, const Teuchos::RCP< const Epetra_MultiVector > &rhsp, const Teuchos::RCP< Epetra_MultiVector > &y, const Teuchos::RCP< Epetra_MultiVector > &u, const Teuchos::RCP< Epetra_MultiVector > &p, double tol)
Solves augmented system.
Teuchos::RCP< Epetra_FEVector > getNy()
int quadrature(const int, const int, Epetra_SerialDenseMatrix &, Epetra_SerialDenseVector &)
float DOT(const int N, const float *X, const float *Y, const int INCX=1, const int INCY=1) const
double Dot(const Epetra_SerialDenseVector &x) const
int ExtractMyRowCopy(int MyRow, int Length, int &NumEntries, double *Values, int *Indices) const
std::ostream & operator<<(std::ostream &, const Usr_Par &)
The GenSQP::Vector / (y,u) Epetra_MultiVector adapter class.
int Shape(int NumRows, int NumCols)
Teuchos::RCP< const Epetra_Comm > getCommPtr()
const Epetra_Comm & Comm() const
Epetra_SerialDenseMatrix N
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
Teuchos::RCP< Epetra_FEVector > getb()
int assemble(const Epetra_Comm &, const Epetra_IntSerialDenseVector &, const Epetra_SerialDenseMatrix &, const Epetra_IntSerialDenseVector &, const Epetra_SerialDenseMatrix &, const Epetra_IntSerialDenseMatrix &, const Epetra_IntSerialDenseMatrix &, Teuchos::RCP< Epetra_FECrsMatrix > &, Teuchos::RCP< Epetra_FECrsMatrix > &, Teuchos::RCP< Epetra_FEVector > &)
int GCID(int LCID_in) const
Teuchos::RCP< Epetra_IntSerialDenseMatrix > e_
Edges.
int inverse(const Epetra_SerialDenseMatrix &, Epetra_SerialDenseMatrix &)
Teuchos::RCP< Epetra_IntSerialDenseVector > ipindx_
Global nodes (interior, nonoverlapping) in this subdomain.
int NumMyNonzeros() const
Teuchos::RCP< Epetra_FECrsMatrix > H_
Volume mass matrix.