1071 int level,
int nodeId,
IntArray &localNodeIdArray,
IntArray &globalNodeIdArray,
1072 HuertaErrorEstimatorInterface :: SetupMode mode,
TimeStep *tStep,
int nodes,
1074 int &localNodeId,
int &localElemId,
int &localBcId,
1076 HuertaErrorEstimator :: AnalysisMode aMode,
const char *edgetype)
1078 std :: list< FloatArray >newNodes;
1079 IntArray *connectivity, boundary(1);
1080 int startNode, endNode, pos, nd, bc, dofs;
1082 if ( nodeId != 0 ) {
1083 startNode = endNode = nodeId;
1091 if ( mode == HuertaErrorEstimatorInterface :: CountMode ) {
1092 for (
int inode = startNode; inode <= endNode; inode++ ) {
1093 localElemId += ( level + 1 );
1099 for (
int m = 0; m < level + 2; m++, pos++ ) {
1100 nd = connectivity->
at(pos);
1101 if ( localNodeIdArray.
at(nd) == 0 ) {
1102 localNodeIdArray.
at(nd) = ++localNodeId;
1107 if ( nodeId == 0 ) {
1108 if ( m == 0 && boundary.
at(1) == 0 ) {
1112 if ( m == level + 1 ) {
1134 if ( mode == HuertaErrorEstimatorInterface :: NodeMode ) {
1135 double x, y, z, u, du = 1.0 / ( level + 1 );
1136 double xc, yc, zc, xm, ym, zm;
1137 int sideNumBc, bcId, bcDofId;
1138 IntArray sideBcDofId, dofIdArray, *loadArray;
1144 for (
int inode = startNode; inode <= endNode; inode++ ) {
1145 xc = corner [ inode - 1 ].
at(1);
1146 yc = corner [ inode - 1 ].
at(2);
1147 zc = corner [ inode - 1 ].
at(3);
1161 hasBc = refinedElement->
giveBcDofArray1D(inode, element, sideBcDofId, sideNumBc, tStep);
1165 for (
int m = 0; m < level + 2; m++, u += du, pos++ ) {
1166 nd = connectivity->
at(pos);
1167 if ( localNodeIdArray.
at(nd) == 0 ) {
1168 auto ir = std::make_unique<DynamicInputRecord>();
1170 localNodeIdArray.
at(nd) = ++localNodeId;
1171 globalNodeIdArray.
at(localNodeId) = nd;
1173 x = xc * ( 1.0 - u ) + xm * u;
1174 y = yc * ( 1.0 - u ) + ym * u;
1175 z = zc * ( 1.0 - u ) + zm * u;
1178 newNodes.push_back(coord);
1185 lcs->
at(2, 1), lcs->
at(2, 2), lcs->
at(2, 3));
1191 if ( nodeId == 0 ) {
1192 if ( m == 0 && boundary.
at(1) == 0 ) {
1196 if ( m == level + 1 ) {
1212 if ( aMode == HuertaErrorEstimator :: HEE_linear ) {
1214 for (
Dof *dof: *node ) {
1221 if ( hasBc ==
true ) {
1226 for (
Dof *nodeDof: *node ) {
1228 if ( nodeDof->hasBc(tStep) != 0 ) {
1229 bcDofId = nodeDof->giveBcId();
1238 if ( ( loadArray = node->giveLoadArray() )->giveSize() != 0 ) {
1242 if ( sideNumBc != 0 ) {
1248 for (
int idof = 1; idof <= dofs; idof++ ) {
1250 if ( bcId <= sideNumBc ) {
1252 if ( nodeDof->giveDofID() == dofIdArray.
at(idof) ) {
1253 bcDofId = nodeDof->giveBcId();
1258 bcs.
at(idof) = bcDofId;
1268 if ( ( loadArray = node->
giveLoadArray() )->giveSize() != 0 ) {
1275 refinedReader.insertInputRecord(DataReader :: IR_dofmanRec, std::move(ir));
1283 std :: vector< FloatArray > newNodesVec( newNodes.begin(), newNodes.end() );
1284 if ( mode == HuertaErrorEstimatorInterface :: ElemMode ) {
1292 for (
int inode = startNode; inode <= endNode; inode++ ) {
1297 for (
int m = 0; m < level + 1; m++ ) {
1298 auto ir = std::make_unique<DynamicInputRecord>();
1300 ir->setRecordKeywordField(edgetype, localElemId);
1304 nd1 = localNodeIdArray.
at( connectivity->
at(nd) );
1305 nd2 = localNodeIdArray.
at( connectivity->
at(nd + 1) );
1311 coordinates1 = newNodesVec [ nd1 - 1 ];
1312 coordinates2 = newNodesVec [ nd2 - 1 ];
1315 for (
int i = 1; i <=
impPos.giveSize(); i++ ) {
1316 if (
impPos.at(i) <
min( coordinates1.
at(i), coordinates2.
at(i) ) ) {
1321 if (
impPos.at(i) >
max( coordinates1.
at(i), coordinates2.
at(i) ) ) {
1328 ir->setField(
IntArray{nd1, nd2},
"nodes");
1329 ir->setField(csect2,
"crosssect");
1337 if ( hasLoad ==
true ) {
1338 if ( boundaryLoadArray.
giveSize() != 0 ) {
1339 ir->setField(boundaryLoadArray,
"boundaryloads");
1343 refinedReader.insertInputRecord(DataReader :: IR_elemRec, std::move(ir));
1348 if ( mode == HuertaErrorEstimatorInterface :: BCMode ) {
1349 if ( aMode == HuertaErrorEstimator :: HEE_linear ) {
1350 double u, du = 1.0 / ( level + 1 );
1351 double xc, yc, zc, xm, ym, zm;
1362 for (
int inode = startNode; inode <= endNode; inode++ ) {
1363 xc = corner [ inode - 1 ].
at(1);
1364 yc = corner [ inode - 1 ].
at(2);
1365 zc = corner [ inode - 1 ].
at(3);
1379 for (
int m = 0; m < level + 2; m++, u += du, pos++ ) {
1380 nd = connectivity->
at(pos);
1381 if ( localNodeIdArray.
at(nd) > 0 ) {
1382 localNodeIdArray.
at(nd) = -localNodeIdArray.
at(nd);
1386 if ( nodeId == 0 ) {
1387 if ( m == 0 && boundary.
at(1) == 0 ) {
1391 if ( m == level + 1 ) {
1404 globCoord.
at(1) = xc * ( 1.0 - u ) + xm * u;
1405 globCoord.
at(2) = yc * ( 1.0 - u ) + ym * u;
1406 globCoord.
at(3) = zc * ( 1.0 - u ) + zm * u;
1411 gp.setNaturalCoordinates(lcoord);
1419 for (
int idof = 1; idof <= dofs; idof++ ) {
1420 auto ir = std::make_unique<DynamicInputRecord>();
1424 refinedReader.insertInputRecord(DataReader :: IR_bcRec, std::move(ir));
1432 for (
int inode = startNode; inode <= endNode; inode++ ) {
1437 for (
int m = 0; m < level + 2; m++, pos++ ) {
1438 nd = connectivity->
at(pos);
1439 if ( localNodeIdArray.
at(nd) > 0 ) {
1440 localNodeIdArray.
at(nd) = -localNodeIdArray.
at(nd);
1444 if ( nodeId == 0 ) {
1445 if ( m == 0 && boundary.
at(1) == 0 ) {
1449 if ( m == level + 1 ) {
1462 for (
int idof = 1; idof <= dofs; idof++ ) {
1464 controlNode.
at(localBcId) = -localNodeIdArray.
at(nd);
1465 controlDof.
at(localBcId) = idof;
1480 int level,
int nodeId,
IntArray &localNodeIdArray,
IntArray &globalNodeIdArray,
1481 HuertaErrorEstimatorInterface :: SetupMode mode,
TimeStep *tStep,
int nodes,
1483 int &localNodeId,
int &localElemId,
int &localBcId,
1485 HuertaErrorEstimator :: AnalysisMode aMode,
const char *quadtype)
1487 IntArray *connectivity, boundary(2);
1488 int startNode, endNode, inode, n, m, pos, nd, bc, dofs;
1491 if ( nodeId != 0 ) {
1492 startNode = endNode = nodeId;
1500 if ( mode == HuertaErrorEstimatorInterface :: CountMode ) {
1501 for ( inode = startNode; inode <= endNode; inode++ ) {
1502 localElemId += ( level + 1 ) * ( level + 1 );
1508 for ( n = 0; n < level + 2; n++ ) {
1509 for ( m = 0; m < level + 2; m++, pos++ ) {
1510 nd = connectivity->
at(pos);
1511 if ( localNodeIdArray.
at(nd) == 0 ) {
1512 localNodeIdArray.
at(nd) = ++localNodeId;
1516 if ( nodeId == 0 ) {
1517 if ( m == 0 && boundary.
at(1) == 0 ) {
1521 if ( n == 0 && boundary.
at(2) == 0 ) {
1525 if ( n == level + 1 || m == level + 1 ) {
1532 if ( m == 0 && boundary.
at(1) == 0 ) {
1536 if ( n == 0 && boundary.
at(2) == 0 ) {
1561 if ( mode == HuertaErrorEstimatorInterface :: NodeMode ) {
1563 double x, y, z, u, v, du = 1.0 / ( level + 1 ), dv = 1.0 / ( level + 1 );
1564 double xc, yc, zc, xs1, ys1, zs1, xs2, ys2, zs2, xm, ym, zm;
1566 std::vector< IntArray >sideBcDofIdList;
1567 IntArray sideNumBc(2), dofIdArray, * loadArray;
1573 sideBcDofIdList.resize(2);
1575 for ( inode = startNode; inode <= endNode; inode++ ) {
1577 if ( ( s2 = inode - 1 ) == 0 ) {
1581 xc = corner [ inode - 1 ].
at(1);
1582 yc = corner [ inode - 1 ].
at(2);
1583 zc = corner [ inode - 1 ].
at(3);
1585 xs1 = midSide [ s1 - 1 ].
at(1);
1586 ys1 = midSide [ s1 - 1 ].
at(2);
1587 zs1 = midSide [ s1 - 1 ].
at(3);
1589 xs2 = midSide [ s2 - 1 ].
at(1);
1590 ys2 = midSide [ s2 - 1 ].
at(2);
1591 zs2 = midSide [ s2 - 1 ].
at(3);
1605 hasBc = refinedElement->
giveBcDofArray2D(inode, element, sideBcDofIdList, sideNumBc, tStep);
1609 for ( n = 0; n < level + 2; n++, v += dv ) {
1611 for ( m = 0; m < level + 2; m++, u += du, pos++ ) {
1612 nd = connectivity->
at(pos);
1613 if ( localNodeIdArray.
at(nd) == 0 ) {
1614 auto ir = std::make_unique<DynamicInputRecord>();
1615 ir->setRecordKeywordField(
"node", localNodeId);
1617 localNodeIdArray.
at(nd) = ++localNodeId;
1618 globalNodeIdArray.
at(localNodeId) = nd;
1620 x = ( xc * ( 1.0 - u ) + xs1 * u ) * ( 1.0 - v ) + ( xs2 * ( 1.0 - u ) + xm * u ) * v;
1621 y = ( yc * ( 1.0 - u ) + ys1 * u ) * ( 1.0 - v ) + ( ys2 * ( 1.0 - u ) + ym * u ) * v;
1622 z = ( zc * ( 1.0 - u ) + zs1 * u ) * ( 1.0 - v ) + ( zs2 * ( 1.0 - u ) + zm * u ) * v;
1624 ir->setField(
Vec3(x, y, z),
"coords");
1628 lcs->
at(2, 1), lcs->
at(2, 2), lcs->
at(2, 3));
1634 if ( nodeId == 0 ) {
1635 if ( m == 0 && boundary.
at(1) == 0 ) {
1639 if ( n == 0 && boundary.
at(2) == 0 ) {
1643 if ( n == level + 1 || m == level + 1 ) {
1650 if ( m == 0 && boundary.
at(1) == 0 ) {
1654 if ( n == 0 && boundary.
at(2) == 0 ) {
1672 if ( aMode == HuertaErrorEstimator :: HEE_linear ) {
1674 for (
int idof = 0; idof < dofs; idof++ ) {
1675 bcs.
at(idof) = ++localBcId;
1677 ir->setField(bcs,
"bc");
1680 if ( hasBc ==
true && ( m == 0 || n == 0 ) ) {
1683 if ( m == 0 && n == 0 ) {
1686 for (
Dof *nodeDof: *node ) {
1688 if ( nodeDof->hasBc(tStep) != 0 ) {
1689 bcDofId = nodeDof->giveBcId();
1700 if ( ( loadArray = node->giveLoadArray() )->giveSize() != 0 ) {
1701 ir->setField(* loadArray,
"load");
1705 if ( m == 0 && sideNumBc.at(1) != 0 ) {
1709 if ( n == 0 && sideNumBc.at(2) != 0 ) {
1718 const IntArray &sideBcDofId = sideBcDofIdList[index-1];
1720 for (
int idof = 1; idof <= dofs; idof++ ) {
1722 if ( bcId <= sideNumBc.at(index) ) {
1724 if ( nodeDof->giveDofID() == dofIdArray.
at(idof) ) {
1725 bcDofId = nodeDof->giveBcId();
1730 bcs.
at(idof) = bcDofId;
1732 ir->setField(bcs,
"bc");
1738 if ( m == 0 && n == 0 ) {
1739 if ( ( loadArray = node->
giveLoadArray() )->giveSize() != 0 ) {
1740 ir->setField(* loadArray,
"load");
1746 refinedReader.insertInputRecord(DataReader :: IR_dofmanRec, std::move(ir));
1755 if ( mode == HuertaErrorEstimatorInterface :: ElemMode ) {
1756 int csect, iside, index;
1757 int nd1, nd2, nd3, nd4;
1759 std::vector< IntArray >boundaryLoadList;
1764 boundaryLoadList.resize(2);
1766 for ( inode = startNode; inode <= endNode; inode++ ) {
1771 for ( n = 0; n < level + 1; n++ ) {
1772 for ( m = 0; m < level + 1; m++ ) {
1773 auto ir = std::make_unique<DynamicInputRecord>();
1774 ir->setRecordKeywordField(quadtype, localElemId);
1778 nd = n * ( level + 2 ) + m + 1;
1780 nd1 = localNodeIdArray.
at( connectivity->
at(nd) );
1781 nd2 = localNodeIdArray.
at( connectivity->
at(nd + 1) );
1782 nd3 = localNodeIdArray.
at( connectivity->
at(nd + level + 3) );
1783 nd4 = localNodeIdArray.
at( connectivity->
at(nd + level + 2) );
1785 ir->setField(
IntArray{nd1, nd2, nd3, nd4},
"nodes");
1786 ir->setField(csect,
"crosssect");
1791 ir->setField(* loadArray,
"bodyloads");
1796 if ( hasLoad ==
true && ( m == 0 || n == 0 ) ) {
1797 if ( m == 0 && n == 0 ) {
1799 for ( iside = 1; iside <= 2; iside++ ) {
1800 if ( boundary.
at(iside) == 0 ) {
1804 loads += boundaryLoadList[iside-1].giveSize();
1808 for ( iside = 1; iside <= 2; iside++ ) {
1809 if ( boundary.
at(iside) == 0 ) {
1813 if ( boundaryLoadList[iside-1].giveSize() == 0 ) {
1817 ir->setField(boundaryLoadList[iside-1],
"boundaryloads");
1822 if ( m == 0 && boundary.
at(1) != 0 && boundaryLoadList[0].giveSize() != 0 ) {
1826 if ( n == 0 && boundary.
at(2) != 0 && boundaryLoadList[1].giveSize() != 0 ) {
1831 ir->setField(boundaryLoadList[index-1],
"boundaryloads");
1836 refinedReader.insertInputRecord(DataReader :: IR_elemRec, std::move(ir));
1844 if ( mode == HuertaErrorEstimatorInterface :: BCMode ) {
1845 if ( aMode == HuertaErrorEstimator :: HEE_linear ) {
1847 double u, v, du = 1.0 / ( level + 1 ), dv = 1.0 / ( level + 1 );
1848 double xc, yc, zc, xs1, ys1, zs1, xs2, ys2, zs2, xm, ym, zm;
1859 for ( inode = startNode; inode <= endNode; inode++ ) {
1861 if ( ( s2 = inode - 1 ) == 0 ) {
1865 xc = corner [ inode - 1 ].
at(1);
1866 yc = corner [ inode - 1 ].
at(2);
1867 zc = corner [ inode - 1 ].
at(3);
1869 xs1 = midSide [ s1 - 1 ].
at(1);
1870 ys1 = midSide [ s1 - 1 ].
at(2);
1871 zs1 = midSide [ s1 - 1 ].
at(3);
1873 xs2 = midSide [ s2 - 1 ].
at(1);
1874 ys2 = midSide [ s2 - 1 ].
at(2);
1875 zs2 = midSide [ s2 - 1 ].
at(3);
1889 for ( n = 0; n < level + 2; n++, v += dv ) {
1891 for ( m = 0; m < level + 2; m++, u += du, pos++ ) {
1892 nd = connectivity->
at(pos);
1893 if ( localNodeIdArray.
at(nd) > 0 ) {
1894 localNodeIdArray.
at(nd) = -localNodeIdArray.
at(nd);
1898 if ( nodeId == 0 ) {
1899 if ( m == 0 && boundary.
at(1) == 0 ) {
1903 if ( n == 0 && boundary.
at(2) == 0 ) {
1907 if ( n == level + 1 || m == level + 1 ) {
1914 if ( m == 0 && boundary.
at(1) == 0 ) {
1918 if ( n == 0 && boundary.
at(2) == 0 ) {
1933 globCoord.
at(1) = ( xc * ( 1.0 - u ) + xs1 * u ) * ( 1.0 - v ) + ( xs2 * ( 1.0 - u ) + xm * u ) * v;
1934 globCoord.
at(2) = ( yc * ( 1.0 - u ) + ys1 * u ) * ( 1.0 - v ) + ( ys2 * ( 1.0 - u ) + ym * u ) * v;
1935 globCoord.
at(3) = ( zc * ( 1.0 - u ) + zs1 * u ) * ( 1.0 - v ) + ( zs2 * ( 1.0 - u ) + zm * u ) * v;
1940 gp.setNaturalCoordinates(lcoord);
1947 for (
int idof = 1; idof <= dofs; idof++ ) {
1948 auto ir = std::make_unique<DynamicInputRecord>();
1949 ir->setRecordKeywordField(
"BoundaryCondition", ++localBcId);
1950 ir->setField(1,
"Function");
1951 ir->setField(uFine.
at(idof),
"prescribedvalue");
1952 refinedReader.insertInputRecord(DataReader :: IR_bcRec, std::move(ir));
1960 for ( inode = startNode; inode <= endNode; inode++ ) {
1965 for ( n = 0; n < level + 2; n++ ) {
1966 for ( m = 0; m < level + 2; m++, pos++ ) {
1967 nd = connectivity->
at(pos);
1968 if ( localNodeIdArray.
at(nd) > 0 ) {
1969 localNodeIdArray.
at(nd) = -localNodeIdArray.
at(nd);
1973 if ( nodeId == 0 ) {
1974 if ( m == 0 && boundary.
at(1) == 0 ) {
1978 if ( n == 0 && boundary.
at(2) == 0 ) {
1982 if ( n == level + 1 || m == level + 1 ) {
1989 if ( m == 0 && boundary.
at(1) == 0 ) {
1993 if ( n == 0 && boundary.
at(2) == 0 ) {
2008 for (
int idof = 1; idof <= dofs; idof++ ) {
2010 controlNode.
at(localBcId) = -localNodeIdArray.
at(nd);
2011 controlDof.
at(localBcId) = idof;
2026 int level,
int nodeId,
IntArray &localNodeIdArray,
IntArray &globalNodeIdArray,
2027 HuertaErrorEstimatorInterface :: SetupMode mode,
TimeStep *tStep,
int nodes,
2029 int &localNodeId,
int &localElemId,
int &localBcId,
2030 int hexaSideNode [ 1 ] [ 3 ],
int hexaFaceNode [ 1 ] [ 3 ],
2032 HuertaErrorEstimator :: AnalysisMode aMode,
const char *hexatype)
2034 IntArray *connectivity, boundary(3);
2035 int startNode, endNode, inode, k, n, m, pos, nd, bc, dofs;
2038 if ( nodeId != 0 ) {
2039 startNode = endNode = nodeId;
2047 if ( mode == HuertaErrorEstimatorInterface :: CountMode ) {
2049 if ( nodes / 2 * 2 != nodes ) {
2062 for ( inode = startNode; inode <= endNode; inode++ ) {
2063 localElemId += ( level + 1 ) * ( level + 1 ) * ( level + 1 );
2069 for ( k = 0; k < level + 2; k++ ) {
2070 for ( n = 0; n < level + 2; n++ ) {
2071 for ( m = 0; m < level + 2; m++, pos++ ) {
2072 nd = connectivity->
at(pos);
2073 if ( localNodeIdArray.
at(nd) == 0 ) {
2074 localNodeIdArray.
at(nd) = ++localNodeId;
2078 if ( nodeId == 0 ) {
2079 if ( m == 0 && boundary.
at(1) == 0 ) {
2083 if ( n == 0 && boundary.
at(2) == 0 ) {
2087 if ( k == 0 && boundary.
at(3) == 0 ) {
2091 if ( k == level + 1 || n == level + 1 || m == level + 1 ) {
2098 if ( m == 0 && boundary.
at(1) == 0 ) {
2102 if ( n == 0 && boundary.
at(2) == 0 ) {
2106 if ( k == 0 && boundary.
at(3) == 0 ) {
2132 if ( mode == HuertaErrorEstimatorInterface :: NodeMode ) {
2133 int s1, s2, s3, f1, f2, f3, index;
2134 double x, y, z, u, v, w, du = 1.0 / ( level + 1 ), dv = 1.0 / ( level + 1 ), dw = 1.0 / ( level + 1 );
2135 double xc, yc, zc, xm, ym, zm;
2136 double xs1, ys1, zs1, xs2, ys2, zs2, xs3, ys3, zs3;
2137 double xf1, yf1, zf1, xf2, yf2, zf2, xf3, yf3, zf3;
2139 std::vector < IntArray >sideBcDofIdList, faceBcDofIdList;
2140 IntArray sideNumBc(3), faceNumBc(3), dofIdArray, * loadArray;
2146 sideBcDofIdList.resize(3);
2147 faceBcDofIdList.resize(3);
2149 for ( inode = startNode; inode <= endNode; inode++ ) {
2150 s1 = hexaSideNode [ inode - 1 ] [ 0 ];
2151 s2 = hexaSideNode [ inode - 1 ] [ 1 ];
2152 s3 = hexaSideNode [ inode - 1 ] [ 2 ];
2153 f1 = hexaFaceNode [ inode - 1 ] [ 0 ];
2154 f2 = hexaFaceNode [ inode - 1 ] [ 1 ];
2155 f3 = hexaFaceNode [ inode - 1 ] [ 2 ];
2157 xc = corner [ inode - 1 ].
at(1);
2158 yc = corner [ inode - 1 ].
at(2);
2159 zc = corner [ inode - 1 ].
at(3);
2161 xs1 = midSide [ s1 - 1 ].
at(1);
2162 ys1 = midSide [ s1 - 1 ].
at(2);
2163 zs1 = midSide [ s1 - 1 ].
at(3);
2165 xs2 = midSide [ s2 - 1 ].
at(1);
2166 ys2 = midSide [ s2 - 1 ].
at(2);
2167 zs2 = midSide [ s2 - 1 ].
at(3);
2169 xs3 = midSide [ s3 - 1 ].
at(1);
2170 ys3 = midSide [ s3 - 1 ].
at(2);
2171 zs3 = midSide [ s3 - 1 ].
at(3);
2173 xf1 = midFace [ f1 - 1 ].
at(1);
2174 yf1 = midFace [ f1 - 1 ].
at(2);
2175 zf1 = midFace [ f1 - 1 ].
at(3);
2177 xf2 = midFace [ f2 - 1 ].
at(1);
2178 yf2 = midFace [ f2 - 1 ].
at(2);
2179 zf2 = midFace [ f2 - 1 ].
at(3);
2181 xf3 = midFace [ f3 - 1 ].
at(1);
2182 yf3 = midFace [ f3 - 1 ].
at(2);
2183 zf3 = midFace [ f3 - 1 ].
at(3);
2197 hasBc = refinedElement->
giveBcDofArray3D(inode, element, sideBcDofIdList, sideNumBc,
2198 faceBcDofIdList, faceNumBc, tStep);
2201 for ( k = 0; k < level + 2; k++, w += dw ) {
2203 for ( n = 0; n < level + 2; n++, v += dv ) {
2205 for ( m = 0; m < level + 2; m++, u += du, pos++ ) {
2206 nd = connectivity->
at(pos);
2207 if ( localNodeIdArray.
at(nd) == 0 ) {
2208 auto ir = std::make_unique<DynamicInputRecord>();
2209 ir->setRecordKeywordField(
"node", localNodeId);
2211 localNodeIdArray.
at(nd) = ++localNodeId;
2212 globalNodeIdArray.
at(localNodeId) = nd;
2214 x = ( ( xc * ( 1.0 - u ) + xs1 * u ) * ( 1.0 - v ) + ( xs2 * ( 1.0 - u ) + xf1 * u ) * v ) * ( 1.0 - w )
2215 + ( ( xs3 * ( 1.0 - u ) + xf2 * u ) * ( 1.0 - v ) + ( xf3 * ( 1.0 - u ) + xm * u ) * v ) * w;
2216 y = ( ( yc * ( 1.0 - u ) + ys1 * u ) * ( 1.0 - v ) + ( ys2 * ( 1.0 - u ) + yf1 * u ) * v ) * ( 1.0 - w )
2217 + ( ( ys3 * ( 1.0 - u ) + yf2 * u ) * ( 1.0 - v ) + ( yf3 * ( 1.0 - u ) + ym * u ) * v ) * w;
2218 z = ( ( zc * ( 1.0 - u ) + zs1 * u ) * ( 1.0 - v ) + ( zs2 * ( 1.0 - u ) + zf1 * u ) * v ) * ( 1.0 - w )
2219 + ( ( zs3 * ( 1.0 - u ) + zf2 * u ) * ( 1.0 - v ) + ( zf3 * ( 1.0 - u ) + zm * u ) * v ) * w;
2221 ir->setField(
Vec3(x, y, z),
"coords");
2225 lcs->
at(2, 1), lcs->
at(2, 2), lcs->
at(2, 3));
2231 if ( nodeId == 0 ) {
2232 if ( m == 0 && boundary.
at(1) == 0 ) {
2236 if ( n == 0 && boundary.
at(2) == 0 ) {
2240 if ( k == 0 && boundary.
at(3) == 0 ) {
2244 if ( k == level + 1 || n == level + 1 || m == level + 1 ) {
2251 if ( m == 0 && boundary.
at(1) == 0 ) {
2255 if ( n == 0 && boundary.
at(2) == 0 ) {
2259 if ( k == 0 && boundary.
at(3) == 0 ) {
2277 if ( aMode == HuertaErrorEstimator :: HEE_linear ) {
2279 for (
int idof = 0; idof < dofs; idof++ ) {
2280 bcs.
at(idof) = ++localBcId;
2282 ir->setField(bcs,
"bc");
2285 if ( hasBc ==
true && ( m == 0 || n == 0 || k == 0 ) ) {
2288 if ( m == 0 && n == 0 && k == 0 ) {
2291 for (
Dof *nodeDof: *node ) {
2293 if ( nodeDof->hasBc(tStep) != 0 ) {
2294 bcDofId = nodeDof->giveBcId();
2305 if ( ( loadArray = node->giveLoadArray() )->giveSize() != 0 ) {
2306 ir->setField(* loadArray,
"load");
2309 if ( ( m == 0 && n == 0 ) || ( m == 0 && k == 0 ) || ( n == 0 && k == 0 ) ) {
2311 if ( n == 0 && k == 0 && sideNumBc.at(1) != 0 ) {
2315 if ( m == 0 && k == 0 && sideNumBc.at(2) != 0 ) {
2319 if ( m == 0 && n == 0 && sideNumBc.at(3) != 0 ) {
2328 const IntArray &sideBcDofId = sideBcDofIdList[index-1];
2330 for (
int idof = 1; idof <= dofs; idof++ ) {
2332 if ( bcId <= sideNumBc.at(index) ) {
2334 if ( nodeDof->
giveDofID() == dofIdArray.
at(idof) ) {
2340 bcs.
at(idof) = bcDofId;
2342 ir->setField(bcs,
"bc");
2346 if ( m == 0 && faceNumBc.at(1) != 0 ) {
2350 if ( n == 0 && faceNumBc.at(2) != 0 ) {
2354 if ( k == 0 && faceNumBc.at(3) != 0 ) {
2363 const IntArray &faceBcDofId = faceBcDofIdList[index-1];
2365 for (
int idof = 1; idof <= dofs; idof++ ) {
2367 if ( bcId <= faceNumBc.at(index) ) {
2369 if ( nodeDof->
giveDofID() == dofIdArray.
at(idof) ) {
2375 bcs.
at(idof) = bcDofId;
2377 ir->setField(bcs,
"bc");
2384 if ( m == 0 && n == 0 ) {
2385 if ( ( loadArray = node->
giveLoadArray() )->giveSize() != 0 ) {
2386 ir->setField(* loadArray,
"loads");
2392 refinedReader.insertInputRecord(DataReader :: IR_dofmanRec, std::move(ir));
2402 if ( mode == HuertaErrorEstimatorInterface :: ElemMode ) {
2404 int nd1, nd2, nd3, nd4, nd5, nd6, nd7, nd8;
2406 std::vector< IntArray >boundaryLoadList;
2411 boundaryLoadList.resize(3);
2413 for ( inode = startNode; inode <= endNode; inode++ ) {
2418 for ( k = 0; k < level + 1; k++ ) {
2419 for ( n = 0; n < level + 1; n++ ) {
2420 for ( m = 0; m < level + 1; m++ ) {
2421 auto ir = std::make_unique<DynamicInputRecord>();
2425 nd = k * ( level + 2 ) * ( level + 2 ) + n * ( level + 2 ) + m + 1;
2427 nd1 = localNodeIdArray.
at( connectivity->
at(nd) );
2428 nd2 = localNodeIdArray.
at( connectivity->
at(nd + 1) );
2429 nd3 = localNodeIdArray.
at( connectivity->
at(nd + level + 3) );
2430 nd4 = localNodeIdArray.
at( connectivity->
at(nd + level + 2) );
2432 nd += ( level + 2 ) * ( level + 2 );
2434 nd5 = localNodeIdArray.
at( connectivity->
at(nd) );
2435 nd6 = localNodeIdArray.
at( connectivity->
at(nd + 1) );
2436 nd7 = localNodeIdArray.
at( connectivity->
at(nd + level + 3) );
2437 nd8 = localNodeIdArray.
at( connectivity->
at(nd + level + 2) );
2439 ir->setRecordKeywordField(hexatype, localElemId);
2440 ir->setField(
IntArray{nd1, nd2, nd3, nd4, nd5, nd6, nd7, nd8},
"nodes");
2441 ir->setField(csect,
"crosssect");
2446 ir->setField(* loadArray,
"bodyloads");
2451 if ( hasLoad ==
true && ( m == 0 || n == 0 || k == 0 ) ) {
2453 for ( iside = 1; iside <= 3; iside++ ) {
2454 if ( boundary.
at(iside) == 0 ) {
2458 if ( m != 0 && iside == 1 ) {
2462 if ( n != 0 && iside == 2 ) {
2466 if ( k != 0 && iside == 3 ) {
2470 loads += boundaryLoadList[iside-1].giveSize();
2474 for ( iside = 1; iside <= 3; iside++ ) {
2475 if ( boundary.
at(iside) == 0 ) {
2479 if ( m != 0 && iside == 1 ) {
2483 if ( n != 0 && iside == 2 ) {
2487 if ( k != 0 && iside == 3 ) {
2491 if ( boundaryLoadList[iside-1].giveSize() == 0 ) {
2495 ir->setField(boundaryLoadList[iside-1],
"boundaryloads");
2500 refinedReader.insertInputRecord(DataReader :: IR_elemRec, std::move(ir));
2509 if ( mode == HuertaErrorEstimatorInterface :: BCMode ) {
2510 if ( aMode == HuertaErrorEstimator :: HEE_linear ) {
2511 int s1, s2, s3, f1, f2, f3;
2512 double u, v, w, du = 1.0 / ( level + 1 ), dv = 1.0 / ( level + 1 ), dw = 1.0 / ( level + 1 );
2513 double xc, yc, zc, xm, ym, zm;
2514 double xs1, ys1, zs1, xs2, ys2, zs2, xs3, ys3, zs3;
2515 double xf1, yf1, zf1, xf2, yf2, zf2, xf3, yf3, zf3;
2524 auto gp =
new GaussPoint(&irule, 1, {}, 1.0, mmode);
2525 for ( inode = startNode; inode <= endNode; inode++ ) {
2526 s1 = hexaSideNode [ inode - 1 ] [ 0 ];
2527 s2 = hexaSideNode [ inode - 1 ] [ 1 ];
2528 s3 = hexaSideNode [ inode - 1 ] [ 2 ];
2529 f1 = hexaFaceNode [ inode - 1 ] [ 0 ];
2530 f2 = hexaFaceNode [ inode - 1 ] [ 1 ];
2531 f3 = hexaFaceNode [ inode - 1 ] [ 2 ];
2533 xc = corner [ inode - 1 ].
at(1);
2534 yc = corner [ inode - 1 ].
at(2);
2535 zc = corner [ inode - 1 ].
at(3);
2537 xs1 = midSide [ s1 - 1 ].
at(1);
2538 ys1 = midSide [ s1 - 1 ].
at(2);
2539 zs1 = midSide [ s1 - 1 ].
at(3);
2541 xs2 = midSide [ s2 - 1 ].
at(1);
2542 ys2 = midSide [ s2 - 1 ].
at(2);
2543 zs2 = midSide [ s2 - 1 ].
at(3);
2545 xs3 = midSide [ s3 - 1 ].
at(1);
2546 ys3 = midSide [ s3 - 1 ].
at(2);
2547 zs3 = midSide [ s3 - 1 ].
at(3);
2549 xf1 = midFace [ f1 - 1 ].
at(1);
2550 yf1 = midFace [ f1 - 1 ].
at(2);
2551 zf1 = midFace [ f1 - 1 ].
at(3);
2553 xf2 = midFace [ f2 - 1 ].
at(1);
2554 yf2 = midFace [ f2 - 1 ].
at(2);
2555 zf2 = midFace [ f2 - 1 ].
at(3);
2557 xf3 = midFace [ f3 - 1 ].
at(1);
2558 yf3 = midFace [ f3 - 1 ].
at(2);
2559 zf3 = midFace [ f3 - 1 ].
at(3);
2573 for ( k = 0; k < level + 2; k++, w += dw ) {
2575 for ( n = 0; n < level + 2; n++, v += dv ) {
2577 for ( m = 0; m < level + 2; m++, u += du, pos++ ) {
2578 nd = connectivity->
at(pos);
2579 if ( localNodeIdArray.
at(nd) > 0 ) {
2580 localNodeIdArray.
at(nd) = -localNodeIdArray.
at(nd);
2584 if ( nodeId == 0 ) {
2585 if ( m == 0 && boundary.
at(1) == 0 ) {
2589 if ( n == 0 && boundary.
at(2) == 0 ) {
2593 if ( k == 0 && boundary.
at(3) == 0 ) {
2597 if ( k == level + 1 || n == level + 1 || m == level + 1 ) {
2604 if ( m == 0 && boundary.
at(1) == 0 ) {
2608 if ( n == 0 && boundary.
at(2) == 0 ) {
2612 if ( k == 0 && boundary.
at(3) == 0 ) {
2627 globCoord.
at(1) = ( ( xc * ( 1.0 - u ) + xs1 * u ) * ( 1.0 - v ) + ( xs2 * ( 1.0 - u ) + xf1 * u ) * v ) * ( 1.0 - w )
2628 + ( ( xs3 * ( 1.0 - u ) + xf2 * u ) * ( 1.0 - v ) + ( xf3 * ( 1.0 - u ) + xm * u ) * v ) * w;
2629 globCoord.
at(2) = ( ( yc * ( 1.0 - u ) + ys1 * u ) * ( 1.0 - v ) + ( ys2 * ( 1.0 - u ) + yf1 * u ) * v ) * ( 1.0 - w )
2630 + ( ( ys3 * ( 1.0 - u ) + yf2 * u ) * ( 1.0 - v ) + ( yf3 * ( 1.0 - u ) + ym * u ) * v ) * w;
2631 globCoord.
at(3) = ( ( zc * ( 1.0 - u ) + zs1 * u ) * ( 1.0 - v ) + ( zs2 * ( 1.0 - u ) + zf1 * u ) * v ) * ( 1.0 - w )
2632 + ( ( zs3 * ( 1.0 - u ) + zf2 * u ) * ( 1.0 - v ) + ( zf3 * ( 1.0 - u ) + zm * u ) * v ) * w;
2637 gp->setNaturalCoordinates(lcoord);
2644 for (
int idof = 1; idof <= dofs; idof++ ) {
2645 auto ir = std::make_unique<DynamicInputRecord>();
2646 ir->setRecordKeywordField(
"boundarycondition", ++localBcId);
2647 ir->setField(1,
"Function");
2648 ir->setField(uFine.
at(idof),
"prescribedvalue");
2649 refinedReader.insertInputRecord(DataReader :: IR_bcRec, std::move(ir));
2659 for ( inode = startNode; inode <= endNode; inode++ ) {
2664 for ( k = 0; k < level + 2; k++ ) {
2665 for ( n = 0; n < level + 2; n++ ) {
2666 for ( m = 0; m < level + 2; m++, pos++ ) {
2667 nd = connectivity->
at(pos);
2668 if ( localNodeIdArray.
at(nd) > 0 ) {
2669 localNodeIdArray.
at(nd) = -localNodeIdArray.
at(nd);
2673 if ( nodeId == 0 ) {
2674 if ( m == 0 && boundary.
at(1) == 0 ) {
2678 if ( n == 0 && boundary.
at(2) == 0 ) {
2682 if ( k == 0 && boundary.
at(3) == 0 ) {
2686 if ( k == level + 1 || n == level + 1 || m == level + 1 ) {
2693 if ( m == 0 && boundary.
at(1) == 0 ) {
2697 if ( n == 0 && boundary.
at(2) == 0 ) {
2701 if ( k == 0 && boundary.
at(3) == 0 ) {
2716 for (
int idof = 1; idof <= dofs; idof++ ) {
2718 controlNode.
at(localBcId) = -localNodeIdArray.
at(nd);
2719 controlDof.
at(localBcId) = idof;
2738HuertaErrorEstimator :: solveRefinedElementProblem(
int elemId,
IntArray &localNodeIdArray,
IntArray &globalNodeIdArray,
2741 int contextFlag = 0;
2746 std::unique_ptr<EngngModel> refinedProblem;
2747 int localNodeId, localElemId, localBcId, localf;
2748 int mats, csects, loads, funcs, nlbarriers;
2749 int inode, dofs, pos, ielem, size;
2751 FloatArray nodeSolution, uCoarse, elementVector, patchVector, coarseVector;
2752 FloatArray elementError, patchError, coarseSolution;
2760 double coeff, elementNorm, patchNorm,
mixedNorm, eNorm = 0.0, uNorm = 0.0;
2765 double et_setup, et_init, et_solve, et_error;
2769 element =
domain->giveElement(elemId);
2773 this->
eNorms.at(elemId) = 0.0;
2780 this->
eNorms.at(elemId) = 0.0;
2791 OOFEM_LOG_DEBUG(
"[%d] Element no %d: estimating error [step number %5d]\n",
2797 if ( interface == NULL ) {
2798 OOFEM_ERROR(
"Element has no Huerta error estimator interface defined");
2801 problem =
domain->giveEngngModel();
2803 mats =
domain->giveNumberOfMaterialModels();
2804 csects =
domain->giveNumberOfCrossSectionModels();
2805 loads =
domain->giveNumberOfBoundaryConditions();
2806 funcs =
domain->giveNumberOfFunctions();
2807 nlbarriers =
domain->giveNumberOfNonlocalBarriers();
2809 localNodeIdArray.
zero();
2816 localNodeIdArray, globalNodeIdArray,
2817 HuertaErrorEstimatorInterface :: CountMode, tStep,
2818 localNodeId, localElemId, localBcId,
2819 controlNode, controlDof,
2823 controlDof.
resize(localBcId);
2824 controlNode.
resize(localBcId);
2828 localNodeIdArray, globalNodeIdArray,
2829 HuertaErrorEstimatorInterface :: BCMode, tStep,
2830 localNodeId, localElemId, localBcId,
2831 controlNode, controlDof,
2839 mats, csects, loads + localBcId, funcs + localf,
2840 controlNode, controlDof, tStep);
2842 globalNodeIdArray.
resize(localNodeId);
2844 localNodeIdArray.
zero();
2850 localNodeIdArray, globalNodeIdArray,
2851 HuertaErrorEstimatorInterface :: NodeMode, tStep,
2852 localNodeId, localElemId, localBcId,
2853 controlNode, controlDof,
2856 localNodeIdArray, globalNodeIdArray,
2857 HuertaErrorEstimatorInterface :: ElemMode, tStep,
2858 localNodeId, localElemId, localBcId,
2859 controlNode, controlDof,
2868 localNodeIdArray, globalNodeIdArray,
2869 HuertaErrorEstimatorInterface :: BCMode, tStep,
2870 localNodeId, localElemId, localBcId,
2871 controlNode, controlDof,
2882 dofs =
domain->giveDofManager(1)->giveNumberOfDofs();
2883 domain->giveElement(1)->giveElementDofIDMask(dofIdArray);
2885#ifdef USE_INPUT_FILE
2886 std :: ostringstream fileName;
2887 fileName <<
"/home/dr/Huerta/element_" << elemId <<
".in";
2902 refinedProblem->checkConsistency();
2905 refinedDomain = refinedProblem->giveDomain(1);
2916 refinedProblem->solveYourself();
2917 refinedProblem->terminateAnalysis();
2923 OOFEM_ERROR(
"Refined problem must be of the type AdaptiveNonLinearStatic");
2935 refinedTStep = refinedProblem->giveCurrentStep();
2937 size = refinedDomain->giveNumberOfDofManagers() * dofs;
2938 coarseSolution.
resize(size);
2939 elementError.
resize(size);
2949 for ( inode = 1; inode <= localNodeId; inode++ ) {
2950 node = refinedDomain->giveNode(inode);
2952 for (
int idof = 1; idof <= dofs; idof++, pos++ ) {
2953 double sol = nodeSolution.
at(idof);
2955 if ( nodeDof->
hasBc(refinedTStep) == 0 ) {
2962 coarseSolution.
at(pos) = coarseSol;
2963 elementError.
at(pos) = sol - coarseSol;
2976 if ( this->
normType == HuertaErrorEstimator :: L2Norm ) {
2978 FloatArray elementVectorGp, patchVectorGp, coarseVectorGp;
2980 eNorm = uNorm = 0.0;
2981 for ( ielem = 1; ielem <= localElemId; ielem++ ) {
2982 element = refinedDomain->giveElement(ielem);
2985 elementNorm = patchNorm =
mixedNorm = 0.0;
2991 this->
extractVectorFrom(element, elementError, elementVector, dofs, refinedTStep);
2995 this->
extractVectorFrom(element, coarseSolution, coarseVector, dofs, refinedTStep);
3004 if ( fabs(elementNorm) < 1.0e-30 ) {
3005 if ( elementNorm == 0.0 ) {
3008 if ( fabs(
mixedNorm) > 1.0e6 * fabs(elementNorm) ) {
3018 eNorm += ( 1.0 + coeff * coeff ) * elementNorm + patchNorm - 2.0 * coeff *
mixedNorm;
3020 }
else if ( this->
normType == HuertaErrorEstimator :: EnergyNorm ) {
3023#ifdef PRINT_FINE_ERROR
3027 OOFEM_LOG_DEBUG(
"------------------------------------------------------------------------------\n");
3030 OOFEM_LOG_DEBUG(
"-------------------------------------------------------------\n");
3035 eNorm = uNorm = 0.0;
3036 for ( ielem = 1; ielem <= localElemId; ielem++ ) {
3037 element = refinedDomain->giveElement(ielem);
3040 this->
extractVectorFrom(element, elementError, elementVector, dofs, refinedTStep);
3042 this->
extractVectorFrom(element, coarseSolution, coarseVector, dofs, refinedTStep);
3045 elementNorm = tmpVector.
dotProduct(elementVector);
3049 patchNorm = tmpVector.
dotProduct(patchVector);
3051 if ( fabs(elementNorm) < 1.0e-30 ) {
3052 if ( elementNorm == 0.0 ) {
3055 if ( fabs(
mixedNorm) > 1.0e6 * fabs(elementNorm) ) {
3065 eNorm += ( 1.0 + coeff * coeff ) * elementNorm + patchNorm - 2.0 * coeff *
mixedNorm;
3070#ifdef PRINT_FINE_ERROR
3071 double pEnorm = coeff * coeff * elementNorm + patchNorm - 2.0 * coeff *
mixedNorm;
3074 elemId, ielem, elementNorm, pEnorm, elementNorm + pEnorm);
3086#ifdef PRINT_FINE_ERROR
3103 double eeeNorm = 0.0;
3107 double sval, maxVal;
3111 element =
domain->giveElement(elemId);
3113 result = element->
giveIPValue(val, gp, IST_PrincipalDamageTensor, tStep);
3115 sval = sqrt( dotProduct( val, val, val.giveSize() ) );
3116 maxVal =
max(maxVal, sval);
3120 if ( maxVal > 0.25 ) {
3121 double rate, size = 1.0, currDensity;
3123 HuertaRemeshingCriteriaInterface *remeshInterface;
3124 remeshInterface =
static_cast< HuertaRemeshingCriteriaInterface *
>( element->
giveInterface(HuertaRemeshingCriteriaInterfaceType) );
3125 if ( !remeshInterface ) {
3126 OOFEM_ERROR(
"element does not support HuertaRemeshingCriteriaInterface");
3129 currDensity = remeshInterface->HuertaRemeshingCriteriaI_giveCharacteristicSize();
3131 rate = currDensity / size;
3136 OOFEM_LOG_DEBUG(
"koko %d dam %e curr %e rate %e\n", elemId, maxVal, currDensity, rate);
3139 eeeNorm = eNorm * rate;
3144 this->
eNorms.at(elemId) = sqrt(eNorm);
3154 OOFEM_LOG_DEBUG(
"HEE info: element %d: user time total %.2f s (setup %.2f s, init %.2f s, solve %.2f s, error %.2f s)\n",
3156 et_setup + et_init + et_solve + et_error,
3167HuertaErrorEstimator :: solveRefinedPatchProblem(
int nodeId,
IntArray &localNodeIdArray,
IntArray &globalNodeIdArray,
3170 int contextFlag = 0;
3175 std::unique_ptr<EngngModel> refinedProblem;
3176 int localNodeId, localElemId, localBcId, localf;
3177 int mats, csects, loads, funcs, nlbarriers;
3178 int inode, elemId, ielem, elems, skipped = 0;
3190 double et_setup, et_init, et_solve, et_error;
3203 for ( ielem = 1; ielem <= elems; ielem++ ) {
3204 elemId = con->
at(ielem);
3205 element =
domain->giveElement(elemId);
3218 if ( skipped == elems ) {
3227 OOFEM_LOG_INFO(
"[%d] Patch no %d: estimating error [step number %5d]\n",
3231 problem =
domain->giveEngngModel();
3233 mats =
domain->giveNumberOfMaterialModels();
3234 csects =
domain->giveNumberOfCrossSectionModels();
3235 loads =
domain->giveNumberOfBoundaryConditions();
3236 funcs =
domain->giveNumberOfFunctions();
3237 nlbarriers =
domain->giveNumberOfNonlocalBarriers();
3239 localNodeIdArray.
zero();
3245 for ( ielem = 1; ielem <= elems; ielem++ ) {
3246 elemId = con->
at(ielem);
3247 element =
domain->giveElement(elemId);
3256 if ( interface == NULL ) {
3257 OOFEM_ERROR(
"Element has no Huerta error estimator interface defined");
3266 localNodeIdArray, globalNodeIdArray,
3267 HuertaErrorEstimatorInterface :: CountMode, tStep,
3268 localNodeId, localElemId, localBcId,
3269 controlNode, controlDof,
3276 controlDof.
resize(localBcId);
3277 controlNode.
resize(localBcId);
3280 for ( ielem = 1; ielem <= elems; ielem++ ) {
3281 elemId = con->
at(ielem);
3282 element =
domain->giveElement(elemId);
3298 localNodeIdArray, globalNodeIdArray,
3299 HuertaErrorEstimatorInterface :: BCMode, tStep,
3300 localNodeId, localElemId, localBcId,
3301 controlNode, controlDof,
3312 mats, csects, loads + localBcId, funcs + localf,
3313 controlNode, controlDof, tStep);
3315 globalNodeIdArray.
resize(localNodeId);
3317 localNodeIdArray.
zero();
3322 for ( ielem = 1; ielem <= elems; ielem++ ) {
3323 elemId = con->
at(ielem);
3324 element =
domain->giveElement(elemId);
3340 localNodeIdArray, globalNodeIdArray,
3341 HuertaErrorEstimatorInterface :: NodeMode, tStep,
3342 localNodeId, localElemId, localBcId,
3343 controlNode, controlDof,
3349 for ( ielem = 1; ielem <= elems; ielem++ ) {
3350 elemId = con->
at(ielem);
3351 element =
domain->giveElement(elemId);
3367 localNodeIdArray, globalNodeIdArray,
3368 HuertaErrorEstimatorInterface :: ElemMode, tStep,
3369 localNodeId, localElemId, localBcId,
3370 controlNode, controlDof,
3380 for ( ielem = 1; ielem <= elems; ielem++ ) {
3381 elemId = con->
at(ielem);
3382 element =
domain->giveElement(elemId);
3398 localNodeIdArray, globalNodeIdArray,
3399 HuertaErrorEstimatorInterface :: BCMode, tStep,
3400 localNodeId, localElemId, localBcId,
3401 controlNode, controlDof,
3415 dofs =
domain->giveDofManager(1)->giveNumberOfDofs();
3416 domain->giveElement(1)->giveElementDofIDMask(dofIdArray);
3418#ifdef USE_INPUT_FILE
3419 std :: ostringstream fileName;
3420 fileName <<
"/home/dr/Huerta/patch_" << nodeId <<
".in";
3435 refinedProblem->checkConsistency();
3438 refinedDomain = refinedProblem->giveDomain(1);
3444 refinedProblem->solveYourself();
3445 refinedProblem->terminateAnalysis();
3451 OOFEM_ERROR(
"Refined problem must be of the type AdaptiveNonLinearStatic");
3465 refinedTStep = refinedProblem->giveCurrentStep();
3468 for (
int inode = 1; inode <= localNodeId; inode++ ) {
3469 refinedDomain->giveNode(inode)->giveUnknownVector(nodeSolution, dofIdArray, VM_Total, refinedTStep);
3470 pos = globalNodeIdArray.
at(inode);
3471 for (
int idof = 1; idof <= dofs; idof++ ) {
3480 OOFEM_LOG_DEBUG(
"HEE info: patch %d: user time total %.2f s (setup %.2f s, init %.2f s, solve %.2f s, error %.2f s)\n",
3482 et_setup + et_init + et_solve + et_error,
3497HuertaErrorEstimator :: solveRefinedWholeProblem(
IntArray &localNodeIdArray,
IntArray &globalNodeIdArray,
3500 int contextFlag = 0;
3504 std::unique_ptr<EngngModel> refinedProblem;
3505 int localNodeId, localElemId, localBcId, localf;
3506 int mats, csects, loads, funcs, nlbarriers;
3507 int inode, dofs, elemId, ielem, elems, size;
3509 FloatArray nodeSolution, uCoarse, errorVector, coarseVector, fineVector;
3510 FloatArray fineSolution, coarseSolution, errorSolution;
3521 double et_setup, et_init, et_solve, et_error;
3529 elems =
domain->giveNumberOfElements();
3531 mats =
domain->giveNumberOfMaterialModels();
3532 csects =
domain->giveNumberOfCrossSectionModels();
3533 loads =
domain->giveNumberOfBoundaryConditions();
3534 funcs =
domain->giveNumberOfFunctions();
3535 nlbarriers =
domain->giveNumberOfNonlocalBarriers();
3537 localNodeIdArray.
zero();
3543 for ( elemId = 1; elemId <= elems; elemId++ ) {
3544 element =
domain->giveElement(elemId);
3547 if ( interface == NULL ) {
3548 OOFEM_ERROR(
"Element has no Huerta error estimator interface defined");
3552 localNodeIdArray, globalNodeIdArray,
3553 HuertaErrorEstimatorInterface :: CountMode, tStep,
3554 localNodeId, localElemId, localBcId,
3555 controlNode, controlDof,
3560 controlDof.
resize(localBcId);
3561 controlNode.
resize(localBcId);
3564 for ( elemId = 1; elemId <= elems; elemId++ ) {
3565 element =
domain->giveElement(elemId);
3569 localNodeIdArray, globalNodeIdArray,
3570 HuertaErrorEstimatorInterface :: BCMode, tStep,
3571 localNodeId, localElemId, localBcId,
3572 controlNode, controlDof,
3581 mats, csects, loads + localBcId, funcs + localf,
3582 controlNode, controlDof, tStep);
3584 globalNodeIdArray.
resize(localNodeId);
3586 localNodeIdArray.
zero();
3591 for ( elemId = 1; elemId <= elems; elemId++ ) {
3592 element =
domain->giveElement(elemId);
3596 localNodeIdArray, globalNodeIdArray,
3597 HuertaErrorEstimatorInterface :: NodeMode, tStep,
3598 localNodeId, localElemId, localBcId,
3599 controlNode, controlDof,
3603 for ( elemId = 1; elemId <= elems; elemId++ ) {
3604 element =
domain->giveElement(elemId);
3608 localNodeIdArray, globalNodeIdArray,
3609 HuertaErrorEstimatorInterface :: ElemMode, tStep,
3610 localNodeId, localElemId, localBcId,
3611 controlNode, controlDof,
3619 for ( elemId = 1; elemId <= elems; elemId++ ) {
3620 element =
domain->giveElement(elemId);
3624 localNodeIdArray, globalNodeIdArray,
3625 HuertaErrorEstimatorInterface :: BCMode, tStep,
3626 localNodeId, localElemId, localBcId,
3627 controlNode, controlDof,
3639 dofs =
domain->giveDofManager(1)->giveNumberOfDofs();
3640 domain->giveElement(1)->giveElementDofIDMask(dofIdArray);
3642 #ifdef USE_INPUT_FILE
3643 std :: ostringstream fileName;
3644 fileName <<
"/home/dr/Huerta/whole_" << 0 <<
".in";
3658 refinedProblem->checkConsistency();
3661 refinedDomain = refinedProblem->giveDomain(1);
3669 refinedProblem->solveYourself();
3670 refinedProblem->terminateAnalysis();
3681 refinedTStep = refinedProblem->giveCurrentStep();
3683 size = refinedDomain->giveNumberOfDofManagers() * dofs;
3684 fineSolution.
resize(size);
3685 coarseSolution.
resize(size);
3686 errorSolution.
resize(size);
3695 for ( inode = 1; inode <= localNodeId; inode++ ) {
3696 node = refinedDomain->giveNode(inode);
3698 for (
int idof = 1; idof <= dofs; idof++, pos++ ) {
3699 fineSolution.
at(pos) = nodeSolution.
at(idof);
3701 if ( nodeDof->
hasBc(refinedTStep) == 0 ) {
3705 coarseSolution.
at(pos) = fineSolution.
at(pos);
3710 errorSolution = fineSolution;
3711 errorSolution.
subtract(coarseSolution);
3713 if ( this->
normType == HuertaErrorEstimator :: L2Norm ) {
3715 FloatArray errorVectorGp, coarseVectorGp, fineVectorGp;
3722 for ( ielem = 1; ielem <= localElemId; ielem++ ) {
3723 element = refinedDomain->giveElement(ielem);
3731 this->
extractVectorFrom(element, errorSolution, errorVector, dofs, refinedTStep);
3735 this->
extractVectorFrom(element, coarseSolution, coarseVector, dofs, refinedTStep);
3746 }
else if ( this->
normType == HuertaErrorEstimator :: EnergyNorm ) {
3750 double fineENorm, coarseENorm;
3751 int dim, pos, nelems;
3754 element =
domain->giveElement(elemId);
3767 for ( ielem = 1; ielem <= localElemId; ielem++ ) {
3771 if ( ++pos == nelems ) {
3773 if ( ielem < localElemId ) {
3775 element =
domain->giveElement(elemId);
3793 element = refinedDomain->giveElement(ielem);
3796 this->
extractVectorFrom(element, errorSolution, errorVector, dofs, refinedTStep);
3799 fineENorm = tmpVector.
dotProduct(errorVector);
3800 coarseENorm += fineENorm;
3802 this->
extractVectorFrom(element, coarseSolution, coarseVector, dofs, refinedTStep);
3814 if ( ++pos == nelems ) {
3816 if ( ielem < localElemId ) {
3818 element =
domain->giveElement(elemId);
3841 OOFEM_LOG_DEBUG(
"HEE info: whole 0: user time total %.2f s (setup %.2f s, init %.2f s, solve %.2f s, error %.2f s)\n",
3842 et_setup + et_init + et_solve + et_error,
3873HuertaErrorEstimator :: setupRefinedProblemProlog(
const char *problemName,
int problemId,
IntArray &localNodeIdArray,
3874 int nodes,
int elems,
int csects,
int mats,
int loads,
int funcs,
3879 int i, nmstep, nsteps = 0;
3880 int ddfunc = 0, ddmSize = 0, ddvSize = 0, hpcSize = 0, hpcwSize = 0, renumber = 1;
3881 int controlMode = 0, hpcMode = 0, stiffMode = 0, maxIter = 30, reqIter = 3, manrmsteps = 0;
3882 double rtolv = -1.0, minStepLength = 0.0, initialStepLength = -1.0, stepLength = -1.0, psi = 1.0;
3886#if defined ( USE_OUTPUT_FILE ) || defined ( USE_CONTEXT_FILE )
3887 sprintf(line,
"/home/dr/Huerta/%s_%d.out", problemName, problemId);
3890 sprintf(line,
"/dev/null");
3896#ifdef USE_CONTEXT_FILE
3897 int contextOutputStep = 1;
3900 sprintf(line,
"Refined problem on %s %d", problemName, problemId);
3904 auto ir = std::make_unique<DynamicInputRecord>();
3908#ifdef USE_CONTEXT_FILE
3911 refinedReader.insertInputRecord(DataReader :: IR_emodelRec, std::move(ir));
3919 switch ( controlMode ) {
3927 initialStepLength = stepLength;
3957 if ( problemId != 0 ) {
3958 auto ir = std::make_unique<DynamicInputRecord>();
3960 int bcSize = controlNode.
giveSize(), ddActiveSize = 0;
3962 if ( controlMode == 1 ) {
3964 for ( i = 1; i <= ddmSize; i += 2 ) {
3965 if ( localNodeIdArray.
at( ddm.
at(i) ) == 0 ) {
3978 if ( nmstep == 1 ) {
3985 ir->setField(rtolv,
"rtolv");
3986 ir->setField(maxIter,
"maxiter");
3987 ir->setField(reqIter,
"reqiterations");
3988 ir->setField(minStepLength,
"minsteplength");
3989 ir->setField(stiffMode,
"stiffmode");
3990 ir->setField(manrmsteps,
"manrmsteps");
3991 ir->setField(manrmsteps,
"manrmsteps");
3993#ifdef USE_CONTEXT_FILE
3999 ir->setField(3,
"eetype");
4000 ir->setField(0,
"meshpackage");
4001 ir->setField(0.1,
"requiredError");
4002 ir->setField(0.01,
"minelemsize");
4016 ir->setField(1,
"equilmc");
4017 ir->setField(1,
"controlmode");
4019#ifdef USE_CONTEXT_FILE
4025 ir->setField(3,
"eetype");
4026 ir->setField(0,
"meshpackage");
4027 ir->setField(0.1,
"requiredError");
4028 ir->setField(0.01,
"minelemsize");
4030 refinedReader.insertInputRecord(DataReader :: IR_emodelRec, std::move(ir));
4037 for ( i = 1; i < nmstep; i++ ) {
4038 auto ir_meta = std::make_unique<DynamicInputRecord>();
4041 ir_meta->setField(rtolv,
"rtolv");
4042 refinedReader.insertInputRecord(DataReader :: IR_mstepRec, std::move(ir_meta));
4047 ir = std::make_unique<DynamicInputRecord>();
4050 ir->setField(rtolv,
"rtolv");
4051 ir->setField(maxIter,
"maxiter");
4052 ir->setField(reqIter,
"reqiterations");
4053 ir->setField(minStepLength,
"minsteplength");
4054 ir->setField(stiffMode,
"stiffmode");
4055 ir->setField(manrmsteps,
"manrmsteps");
4056 ir->setField(1,
"equilmc");
4057 ir->setField(1,
"controlmode");
4061 IntArray ddm_vals( 2 * ( bcSize + ddActiveSize ) );
4063 for ( i = 1; i <= bcSize; i++ ) {
4064 ddm_vals.
at(i * 2 - 1) = controlNode.
at(i);
4065 ddm_vals.
at(i * 2) = controlDof.
at(i);
4068 if ( controlMode == 1 ) {
4070 for ( i = 1; i <= ddmSize; i += 2 ) {
4071 if ( localNodeIdArray.
at( ddm.
at(i) ) == 0 ) {
4075 ddm_vals.
at(bcSize * 2 + i * 2 - 1) = -localNodeIdArray.
at( ddm.
at(i) );
4076 ddm_vals.
at(bcSize * 2 + i * 2) = ddm.
at(i + 1);
4079 ir->setField(ddm_vals,
"ddm");
4084 for ( i = 1; i <= bcSize; i++ ) {
4085 ddv_vals.
at(i) = 0.;
4088 if ( controlMode == 1 ) {
4090 for ( i = 1; i <= ddvSize; i++ ) {
4091 if ( localNodeIdArray.
at( ddm.
at(2 * i - 1) ) == 0 ) {
4095 ddv_vals.
at(bcSize + i) = ddv.
at(i);
4098 ir->setField(ddv_vals,
"ddv");
4103 refinedReader.insertInputRecord(DataReader :: IR_mstepRec, std::move(ir));
4115 auto ir = std::make_unique<DynamicInputRecord>();
4116 ir->setRecordKeywordField(
"nonlinearstatic", 0);
4118 ir->setField(renumber,
"renumber");
4119 ir->setField(rtolv,
"rtolv");
4120 ir->setField(maxIter,
"maxiter");
4121 ir->setField(reqIter,
"reqiterations");
4122 ir->setField(minStepLength,
"minsteplength");
4123 ir->setField(stiffMode,
"stiffmode");
4124 ir->setField(manrmsteps,
"manrmsteps");
4125 ir->setField(1,
"equilmc");
4126 ir->setField(controlMode,
"controlmode");
4127#ifdef USE_CONTEXT_FILE
4131 switch ( controlMode ) {
4133 ir->setField(stepLength,
"stepLength");
4134 ir->setField(initialStepLength,
"initialStepLength");
4135 ir->setField(psi,
"psi");
4136 ir->setField(hpcMode,
"hpcmode");
4138 if ( hpcSize != 0 ) {
4141 for ( i = 1; i <= hpcSize; i += 2 ) {
4142 hpc_vals.
at(i * 2 - 1) = -localNodeIdArray.
at( hpc.
at(i) );
4143 hpc_vals.
at(i * 2) = hpc.
at(i + 1);
4145 ir->setField(hpc_vals,
"hpc");
4148 if ( hpcwSize != 0 ) {
4149 ir->setField(hpcw,
"hpcw");
4154 if ( ddmSize != 0 ) {
4157 for ( i = 1; i <= ddmSize; i += 2 ) {
4158 ddm_vals.
at(i * 2 - 1) = -localNodeIdArray.
at( ddm.
at(i) );
4159 ddm_vals.
at(i * 2) = ddm.
at(i + 1);
4161 ir->setField(
"ddm");
4164 if ( ddvSize != 0 ) {
4165 ir->setField(ddv,
"ddv");
4173 refinedReader.insertInputRecord(DataReader :: IR_emodelRec, std::move(ir));
4179 auto ir = std::make_unique<DynamicInputRecord>();
4181 if ( this->
domain->isAxisymmetric() ) {
4186 refinedReader.insertInputRecord(DataReader :: IR_domainCompRec, std::move(ir));
4188 ir = std::make_unique<DynamicInputRecord>();
4190#ifdef USE_OUTPUT_FILE
4196 refinedReader.insertInputRecord(DataReader :: IR_outManRec, std::move(ir));
4198 ir = std::make_unique<DynamicInputRecord>();
4199 ir->setRecordKeywordField(
"", 0);
4206 refinedReader.insertInputRecord(DataReader :: IR_domainCompRec, std::move(ir));