214 lines
9.1 KiB
C
214 lines
9.1 KiB
C
/******************************************************************************
|
|
*
|
|
* MantaFlow fluid solver framework
|
|
* Copyright 2011 Tobias Pfaff, Nils Thuerey
|
|
*
|
|
* This program is free software, distributed under the terms of the
|
|
* Apache License, Version 2.0
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Analytical solutions to some problems
|
|
* generated using MATLAB symbolic math ccode
|
|
*
|
|
******************************************************************************/
|
|
|
|
#ifndef _SOLVANA_H
|
|
#define _SOLVANA_H
|
|
|
|
//! solves the equation [e1 e2 e3; 1 1 1]*x = g using least squares
|
|
inline void SolveOverconstraint34(float e1x,
|
|
float e1y,
|
|
float e1z,
|
|
float e2x,
|
|
float e2y,
|
|
float e2z,
|
|
float e3x,
|
|
float e3y,
|
|
float e3z,
|
|
float g1,
|
|
float g2,
|
|
float g3,
|
|
float &x1,
|
|
float &x2,
|
|
float &x3)
|
|
{
|
|
float e1x2 = e1x * e1x, e1y2 = e1y * e1y, e1z2 = e1z * e1z;
|
|
float e2x2 = e2x * e2x, e2y2 = e2y * e2y, e2z2 = e2z * e2z;
|
|
float e3x2 = e3x * e3x, e3y2 = e3y * e3y, e3z2 = e3z * e3z;
|
|
float e1xy = e1x * e1y, e1xz = e1x * e1z, e1yz = e1y * e1z;
|
|
float e2xy = e2x * e2y, e2xz = e2x * e2z, e2yz = e2y * e2z;
|
|
float e3xy = e3x * e3y, e3xz = e3x * e3z, e3yz = e3y * e3z;
|
|
float e12x = e1x * e2x, e12y = e1y * e2y, e12z = e1z * e2z;
|
|
float e13x = e1x * e3x, e13y = e1y * e3y, e13z = e1z * e3z;
|
|
float e23x = e2x * e3x, e23y = e2y * e3y, e23z = e2z * e3z;
|
|
float t1543 = e3y2 * e2x2;
|
|
float t1544 = e3x2 * e2y2;
|
|
float t1545 = e3z2 * e2x2;
|
|
float t1546 = e3x2 * e2z2;
|
|
float t1547 = e3z2 * e2y2;
|
|
float t1548 = e3y2 * e2z2;
|
|
float t1549 = e2y2 * e1x2;
|
|
float t1550 = e2x2 * e1y2;
|
|
float t1551 = e2z2 * e1x2;
|
|
float t1552 = e2x2 * e1z2;
|
|
float t1553 = e2z2 * e1y2;
|
|
float t1554 = e2y2 * e1z2;
|
|
float t1555 = e3y2 * e1x2;
|
|
float t1556 = e3x2 * e1y2;
|
|
float t1557 = e3z2 * e1x2;
|
|
float t1558 = e3x2 * e1z2;
|
|
float t1559 = e3z2 * e1y2;
|
|
float t1560 = e3y2 * e1z2;
|
|
float t1561 = e3z2 * e2y2 * e1x2;
|
|
float t1562 = e3y2 * e2z2 * e1x2;
|
|
float t1563 = e3z2 * e2x2 * e1y2;
|
|
float t1564 = e3x2 * e2z2 * e1y2;
|
|
float t1565 = e3y2 * e2x2 * e1z2;
|
|
float t1566 = e3x2 * e2y2 * e1z2;
|
|
float t1567 = e1xy * e2x * e3y * 2.0;
|
|
float t1568 = e1xy * e2y * e3x * 2.0;
|
|
float t1569 = e1xz * e2x * e3z * 2.0;
|
|
float t1570 = e1xz * e2z * e3x * 2.0;
|
|
float t1571 = e1yz * e2y * e3z * 2.0;
|
|
float t1572 = e1yz * e2z * e3y * 2.0;
|
|
float t1573 = e1x * e2xy * e3y * 2.0;
|
|
float t1574 = e1y * e2xy * e3x * 2.0;
|
|
float t1575 = e1x * e2xz * e3z * 2.0;
|
|
float t1576 = e1z * e2xz * e3x * 2.0;
|
|
float t1577 = e1y * e2yz * e3z * 2.0;
|
|
float t1578 = e1z * e2yz * e3y * 2.0;
|
|
float t1579 = e1x * e2y * e3xy * 2.0;
|
|
float t1580 = e1y * e2x * e3xy * 2.0;
|
|
float t1581 = e1x * e2z * e3xz * 2.0;
|
|
float t1582 = e1z * e2x * e3xz * 2.0;
|
|
float t1583 = e1y * e2z * e3yz * 2.0;
|
|
float t1584 = e1z * e2y * e3yz * 2.0;
|
|
float t1585 = e1xy * e2xz * e3yz * 2.0;
|
|
float t1586 = e1xy * e2yz * e3xz * 2.0;
|
|
float t1587 = e1xz * e2xy * e3yz * 2.0;
|
|
float t1588 = e1xz * e2yz * e3xy * 2.0;
|
|
float t1589 = e1yz * e2xy * e3xz * 2.0;
|
|
float t1590 = e1yz * e2xz * e3xy * 2.0;
|
|
float t1596 = e12x * e3y2 * 2.0;
|
|
float t1597 = e13x * e2y2 * 2.0;
|
|
float t1598 = e23x * e1y2 * 2.0;
|
|
float t1599 = e12x * e3z2 * 2.0;
|
|
float t1600 = e13x * e2z2 * 2.0;
|
|
float t1601 = e12y * e3x2 * 2.0;
|
|
float t1602 = e13y * e2x2 * 2.0;
|
|
float t1603 = e23y * e1x2 * 2.0;
|
|
float t1604 = e23x * e1z2 * 2.0;
|
|
float t1605 = e12y * e3z2 * 2.0;
|
|
float t1606 = e13y * e2z2 * 2.0;
|
|
float t1607 = e12z * e3x2 * 2.0;
|
|
float t1608 = e13z * e2x2 * 2.0;
|
|
float t1609 = e23z * e1x2 * 2.0;
|
|
float t1610 = e23y * e1z2 * 2.0;
|
|
float t1611 = e12z * e3y2 * 2.0;
|
|
float t1612 = e13z * e2y2 * 2.0;
|
|
float t1613 = e23z * e1y2 * 2.0;
|
|
float t1614 = e1xy * e2xy * 2.0;
|
|
float t1615 = e1xz * e2xz * 2.0;
|
|
float t1616 = e1yz * e2yz * 2.0;
|
|
float t1617 = e1xy * e3xy * 2.0;
|
|
float t1618 = e1xz * e3xz * 2.0;
|
|
float t1619 = e1yz * e3yz * 2.0;
|
|
float t1620 = e2xy * e3xy * 2.0;
|
|
float t1621 = e2xz * e3xz * 2.0;
|
|
float t1622 = e2yz * e3yz * 2.0;
|
|
float t1623 = e1xy * e2xy * e3z2 * 2.0;
|
|
float t1624 = e1xz * e2xz * e3y2 * 2.0;
|
|
float t1625 = e1yz * e2yz * e3x2 * 2.0;
|
|
float t1626 = e1xy * e3xy * e2z2 * 2.0;
|
|
float t1627 = e1xz * e3xz * e2y2 * 2.0;
|
|
float t1628 = e1yz * e3yz * e2x2 * 2.0;
|
|
float t1629 = e2xy * e3xy * e1z2 * 2.0;
|
|
float t1630 = e2xz * e3xz * e1y2 * 2.0;
|
|
float t1631 = e2yz * e3yz * e1x2 * 2.0;
|
|
float t1591 = t1550 + t1551 + t1560 + t1543 + t1552 + t1561 + t1570 + t1544 + t1553 + t1562 +
|
|
t1571 + t1580 + t1545 + t1554 + t1563 + t1572 + t1581 + t1590 + t1546 + t1555 +
|
|
t1564 + t1573 + t1582 + t1547 + t1556 + t1565 + t1574 + t1583 + t1548 + t1557 +
|
|
t1566 + t1575 + t1584 + t1549 + t1558 + t1567 + t1576 + t1585 + t1559 + t1568 +
|
|
t1577 + t1586 + t1569 + t1578 + t1587 - t1596 + t1579 + t1588 - t1597 + t1589 -
|
|
t1598 - t1599 - t1600 - t1601 - t1610 - t1602 - t1611 - t1620 - t1603 - t1612 -
|
|
t1621 - t1630 - t1604 - t1613 - t1622 - t1631 - t1605 - t1614 - t1623 - t1606 -
|
|
t1615 - t1624 - t1607 - t1616 - t1625 - t1608 - t1617 - t1626 - t1609 - t1618 -
|
|
t1627 - t1619 - t1628 - t1629;
|
|
float t1592 = 1.0 / t1591;
|
|
float t1635 = e13x * e2y2;
|
|
float t1636 = e13x * e2z2;
|
|
float t1637 = e13y * e2x2;
|
|
float t1638 = e13y * e2z2;
|
|
float t1639 = e13z * e2x2;
|
|
float t1640 = e13z * e2y2;
|
|
float t1653 = e23x * 2.0;
|
|
float t1654 = e23y * 2.0;
|
|
float t1655 = e23z * 2.0;
|
|
float t1641 = e3x2 + e3z2 + e3y2 + e2y2 + t1543 + e2z2 + t1544 + e2x2 + t1545 + t1546 + t1547 +
|
|
t1548 - t1620 - t1621 - t1622 - t1653 - t1654 - t1655;
|
|
float t1642 = e12x * e3y2;
|
|
float t1643 = e12x * e3z2;
|
|
float t1644 = e12y * e3x2;
|
|
float t1645 = e12y * e3z2;
|
|
float t1646 = e12z * e3x2;
|
|
float t1647 = e12z * e3y2;
|
|
float t1656 = e1x * e2y * e3xy;
|
|
float t1657 = e1y * e2x * e3xy;
|
|
float t1658 = e1x * e2z * e3xz;
|
|
float t1659 = e1z * e2x * e3xz;
|
|
float t1660 = e1y * e2z * e3yz;
|
|
float t1661 = e1z * e2y * e3yz;
|
|
float t1648 = e3x2 + e3z2 + e3y2 - e13x - e13y - e13z + e12x - e23y + e12y + t1642 - e23z -
|
|
t1660 + e12z + t1643 - t1661 + t1644 + t1645 + t1646 + t1647 - t1656 - t1657 -
|
|
e23x - t1658 - t1659;
|
|
float t1679 = e1x * e2xy * e3y;
|
|
float t1680 = e1y * e2xy * e3x;
|
|
float t1681 = e1x * e2xz * e3z;
|
|
float t1682 = e1z * e2xz * e3x;
|
|
float t1683 = e1y * e2yz * e3z;
|
|
float t1684 = e1z * e2yz * e3y;
|
|
float t1652 = e2y2 + e2z2 + e2x2 + e13x + e13y + e13z + t1640 - e12x - e23y - e12y - e23z -
|
|
e12z + t1635 - t1680 + t1636 - t1681 + t1637 - t1682 + t1638 - t1683 + t1639 -
|
|
t1684 - e23x - t1679;
|
|
float t1662 = e23x * e1y2;
|
|
float t1663 = e23y * e1x2;
|
|
float t1664 = e23x * e1z2;
|
|
float t1665 = e23z * e1x2;
|
|
float t1666 = e23y * e1z2;
|
|
float t1667 = e23z * e1y2;
|
|
float t1670 = e1xy * e2x * e3y;
|
|
float t1671 = e1xy * e2y * e3x;
|
|
float t1672 = e1xz * e2x * e3z;
|
|
float t1673 = e1xz * e2z * e3x;
|
|
float t1674 = e1yz * e2y * e3z;
|
|
float t1675 = e1yz * e2z * e3y;
|
|
float t1668 = e1x2 + e1y2 + e1z2 - e13x - e13y - e13z - e12x + e23y - e12y + e23z - e12z -
|
|
t1670 + t1662 - t1671 + t1663 - t1672 + t1664 - t1673 + t1665 - t1674 + t1666 -
|
|
t1675 + e23x + t1667;
|
|
float t1676 = e13x * 2.0;
|
|
float t1677 = e13y * 2.0;
|
|
float t1678 = e13z * 2.0;
|
|
float t1669 = e3x2 + e3z2 + e3y2 + t1560 + e1x2 + t1555 + e1y2 + t1556 + e1z2 + t1557 + t1558 +
|
|
t1559 - t1617 - t1618 - t1619 - t1676 - t1677 - t1678;
|
|
float t1686 = e12x * 2.0;
|
|
float t1687 = e12y * 2.0;
|
|
float t1688 = e12z * 2.0;
|
|
float t1685 = t1550 + t1551 + e2y2 + t1552 + e2z2 + t1553 + e2x2 + t1554 + e1x2 + e1y2 + e1z2 +
|
|
t1549 - t1614 - t1615 - t1616 - t1686 - t1687 - t1688;
|
|
x1 = -g2 * (-e1y * t1592 * t1641 + e2y * t1592 * t1648 + e3y * t1592 * t1652) -
|
|
g3 * (-e1z * t1592 * t1641 + e2z * t1592 * t1648 + e3z * t1592 * t1652) -
|
|
g1 * (-e1x * t1592 * t1641 + e2x * t1592 * t1648 +
|
|
e3x * t1592 *
|
|
(e2y2 + e2z2 + e2x2 + e13x + e13y + e13z + t1640 + t1635 + t1636 + t1637 + t1638 +
|
|
t1639 - e12x - e12y - e12z - e23x - e23y - e23z - e1x * e2xy * e3y -
|
|
e1y * e2xy * e3x - e1x * e2xz * e3z - e1z * e2xz * e3x - e1y * e2yz * e3z -
|
|
e1z * e2yz * e3y));
|
|
x2 = -g1 * (e1x * t1592 * t1648 - e2x * t1592 * t1669 + e3x * t1592 * t1668) -
|
|
g2 * (e1y * t1592 * t1648 - e2y * t1592 * t1669 + e3y * t1592 * t1668) -
|
|
g3 * (e1z * t1592 * t1648 - e2z * t1592 * t1669 + e3z * t1592 * t1668);
|
|
x3 = -g1 * (e1x * t1592 * t1652 + e2x * t1592 * t1668 - e3x * t1592 * t1685) -
|
|
g2 * (e1y * t1592 * t1652 + e2y * t1592 * t1668 - e3y * t1592 * t1685) -
|
|
g3 * (e1z * t1592 * t1652 + e2z * t1592 * t1668 - e3z * t1592 * t1685);
|
|
}
|
|
|
|
#endif |