14 #define fei_file "HexBeam.cpp"
27 dofPerNode_(DofPerNode)
42 throw std::runtime_error(
"HexBeam: size D must be greater or equal num-procs.");
55 if (remainder <= localProc && remainder > 0) {
83 int elemX = elemID%
W_;
84 int elemY = (elemID%(
W_*
W_))/
W_;
87 + elemY*(
W_+1) + elemX;
89 nodeIDs[0] = firstElemNode;
90 nodeIDs[1] = firstElemNode+1;
91 nodeIDs[2] = firstElemNode+
W_+1;
92 nodeIDs[3] = nodeIDs[2]+1;
110 for(i=0; i<len; ++i) {
121 for(i=0; i<len; ++i) {
122 int offset = i*len+i;
123 elemMat[offset] = 4.0;
127 for(i=0; i<len; ++i) {
128 int offset = i*len+i;
130 elemMat[offset-2] = -0.5;
134 elemMat[offset+2] = -0.5;
138 elemMat[offset-4] = -0.1;
141 elemMat[offset+4] = -0.1;
155 for(i=0; i<len; ++i) {
165 return( numBCNodes );
176 for(
int i=0; i<numNodes; ++i) {
177 nodeIDs[i] = firstBCNode +
W_+1;
189 for(
int i=0; i<numBCNodes; ++i) {
190 offsetsIntoField[i] = 0;
206 return(numSharedNodes);
211 int*& numSharingProcsPerNode,
221 numSharingProcsPerNode =
new int[numSharedNodes];
222 sharingProcs =
new int*[numSharedNodes];
223 int* sharingProcVals =
new int[numSharedNodes];
224 if (
sharedNodes == NULL || numSharingProcsPerNode == NULL ||
225 sharingProcs == NULL || sharingProcVals == NULL) {
230 for(i=0; i<numSharedNodes; ++i) {
231 numSharingProcsPerNode[i] = 1;
232 sharingProcs[i] = &(sharingProcVals[i]);
287 int** fieldIDsTable =
new int*[nodesPerElem];
288 int* numFieldsPerNode =
new int[nodesPerElem];
290 for(
int j=0; j<nodesPerElem; ++j) {
291 numFieldsPerNode[j] = 1;
292 fieldIDsTable[j] =
new int[numFieldsPerNode[j]];
293 for(
int k=0; k<numFieldsPerNode[j]; ++k) {
294 fieldIDsTable[j][k] = fieldID;
309 int* nodeIDs =
new int[nodesPerElem];
310 if (nodeIDs == NULL)
return(-1);
312 for(
int i=0; i<numLocalElems; ++i) {
315 CHK_ERR(
fei->initElem(blockID, firstLocalElem+i, nodeIDs) );
319 delete [] numFieldsPerNode;
320 for(
int jj=0; jj<nodesPerElem; ++jj) {
321 delete [] fieldIDsTable[jj];
323 delete [] fieldIDsTable;
331 if (numSharedNodes == 0) {
336 int* numSharingProcsPerNode = NULL;
337 int** sharingProcs = NULL;
338 if (numSharedNodes > 0) {
345 numSharingProcsPerNode, sharingProcs) );
348 delete [] numSharingProcsPerNode;
349 delete [] sharingProcs[0];
350 delete [] sharingProcs;
363 int* crnodes_1d =
new int[numCRs*numNodesPerCR];
364 int** crNodes =
new int*[numCRs];
366 for(i=0; i<numCRs; ++i) {
367 crNodes[i] = &(crnodes_1d[offset]);
368 offset += numNodesPerCR;
374 int* fieldIDs =
new int[numNodesPerCR];
375 for(i=0; i<numNodesPerCR; ++i) fieldIDs[i] = 0;
377 for(i=0; i<numCRs; ++i) {
378 CHK_ERR(
fei->initCRMult(numNodesPerCR, crNodes[i], fieldIDs, crID) );
386 firstLocalCRID = crID;
390 delete [] crnodes_1d;
405 int* crnodes_1d =
new int[numCRs*numNodesPerCR];
406 int** crNodes =
new int*[numCRs];
408 for(i=0; i<numCRs; ++i) {
409 crNodes[i] = &(crnodes_1d[offset]);
410 offset += numNodesPerCR;
415 int* fieldIDs =
new int[numNodesPerCR];
416 for(i=0; i<numNodesPerCR; ++i) fieldIDs[i] = 0;
419 double* weights =
new double[fieldSize*numNodesPerCR];
421 for(i=0; i<fieldSize*numNodesPerCR; ++i) weights[i] = 0.0;
423 weights[fieldSize] = 1.0;
424 double rhsValue = 0.0;
426 for(i=0; i<numCRs; ++i) {
428 numNodesPerCR, crNodes[i], fieldIDs,
429 weights, rhsValue) );
432 delete [] crnodes_1d;
448 int len = nodesPerElem*fieldSize;
449 double* elemMat =
new double[len*len];
450 double** elemMat2D =
new double*[len];
451 double* elemVec =
new double[len];
453 int* nodeIDs =
new int[nodesPerElem];
455 if (elemMat == NULL || elemMat2D == NULL || elemVec == NULL ||
460 for(
int j=0; j<len; ++j) {
461 elemMat2D[j] = &(elemMat[j*len]);
467 for(
int i=0; i<numLocalElems; ++i) {
470 CHK_ERR(
fei->sumInElemMatrix(blockID, firstLocalElem+i,
473 CHK_ERR(
fei->sumInElemRHS(blockID, firstLocalElem+i, nodeIDs, elemVec) );
487 if (numBCNodes == 0) {
491 int* nodeIDs =
new int[numBCNodes];
495 int* offsetsIntoField =
new int[numBCNodes];
496 double* prescribed_vals =
new double[numBCNodes];
502 CHK_ERR(
fei->loadNodeBCs(numBCNodes, nodeIDs,
503 fieldID, offsetsIntoField, prescribed_vals) );
506 delete [] offsetsIntoField;
507 delete [] prescribed_vals;
525 nodeIDType, fieldID);
538 int* nodeIDs =
new int[nodesPerElem];
539 if (nodeIDs == NULL)
return(-1);
541 for(
int i=0; i<numLocalElems; ++i) {
555 if (numSharedNodes == 0) {
560 int* numSharingProcsPerNode = NULL;
561 int** sharingProcs = NULL;
562 if (numSharedNodes > 0) {
577 delete [] numSharingProcsPerNode;
578 delete [] sharingProcs[0];
579 delete [] sharingProcs;
593 int* crnodes_1d =
new int[numCRs*numNodesPerCR];
594 int** crNodes =
new int*[numCRs];
596 for(i=0; i<numCRs; ++i) {
597 crNodes[i] = &(crnodes_1d[offset]);
598 offset += numNodesPerCR;
604 firstLocalCRID = crID;
609 int* fieldIDs =
new int[numNodesPerCR];
610 int* idTypes =
new int[numNodesPerCR];
611 for(i=0; i<numNodesPerCR; ++i) {
613 idTypes[i] = nodeIDType;
616 for(i=0; i<numCRs; ++i) {
629 delete [] crnodes_1d;
644 int* crnodes_1d =
new int[numCRs*numNodesPerCR];
645 int** crNodes =
new int*[numCRs];
647 for(i=0; i<numCRs; ++i) {
648 crNodes[i] = &(crnodes_1d[offset]);
649 offset += numNodesPerCR;
656 int* fieldIDs =
new int[numNodesPerCR];
657 int* idTypes =
new int[numNodesPerCR];
658 for(i=0; i<numNodesPerCR; ++i) {
660 idTypes[i] = nodeIDType;
664 double* weights =
new double[fieldSize*numNodesPerCR];
666 for(i=0; i<fieldSize*numNodesPerCR; ++i) weights[i] = 0.0;
668 weights[fieldSize] = 1.0;
669 double rhsValue = 0.0;
670 int offsetOfSlave = 0;
671 int offsetIntoSlaveField = 0;
673 for(i=0; i<numCRs; ++i) {
679 offsetIntoSlaveField,
684 delete [] crnodes_1d;
703 int len = nodesPerElem*fieldSize;
704 double* elemMat =
new double[len*len];
705 double** elemMat2D =
new double*[len];
706 double* elemVec =
new double[len];
708 if (elemMat == NULL || elemMat2D == NULL || elemVec == NULL) {
712 for(
int j=0; j<len; ++j) {
713 elemMat2D[j] = &(elemMat[j*len]);
720 std::vector<int> indices(len);
726 for(
int i=0; i<numLocalElems; ++i) {
757 double* weights =
new double[fieldSize*numNodesPerCR];
760 for(i=0; i<fieldSize*numNodesPerCR; ++i) weights[i] = 0.0;
762 weights[fieldSize] = 1.0;
763 double rhsValue = 0.0;
765 for(i=0; i<numCRs; ++i) {
767 weights, rhsValue) );
778 if (numBCNodes == 0) {
782 int* nodeIDs =
new int[numBCNodes];
787 int* offsetsIntoField =
new int[numBCNodes];
788 double* prescribed_vals =
new double[numBCNodes];
796 offsetsIntoField, prescribed_vals) );
798 delete [] offsetsIntoField;
799 delete [] prescribed_vals;