|
6 | 6 |
|
7 | 7 | from .mesh import MeshStructure |
8 | 8 | from .mesh import Grid1D, Grid2D, Grid3D |
| 9 | +from .mesh import SphericalGrid1D, CylindricalGrid1D |
9 | 10 | from .mesh import CylindricalGrid2D |
10 | 11 | from .mesh import PolarGrid2D, CylindricalGrid3D, SphericalGrid3D |
11 | 12 | from .utilities import int_range |
@@ -897,6 +898,9 @@ def boundaryConditionsTerm1D(BC: BoundaryConditions1D): |
897 | 898 | s[q] = -(BC.left.b.item()/2 - BC.left.a.item()/dx_1) |
898 | 899 | BCRHS[G[i]] = -BC.left.c.item() |
899 | 900 | elif BC.right.periodic or BC.left.periodic: # periodic boundary condition |
| 901 | + if (type(BC.domain) is SphericalGrid1D)\ |
| 902 | + or (type(BC.domain) is CylindricalGrid1D): |
| 903 | + raise ValueError("Radial periodic boundary conditions are not physically meaningful.") |
900 | 904 | # Right boundary |
901 | 905 | i = Nx+1 |
902 | 906 | q = q+1 |
@@ -1024,11 +1028,11 @@ def boundaryConditionsTerm2D(BC: BoundaryConditions2D): |
1024 | 1028 | s[q] = 1 |
1025 | 1029 | q = q[-1]+i |
1026 | 1030 | ii[q] = G[i,j] |
1027 | | - jj[q] = G[i,Ny+1] |
| 1031 | + jj[q] = G[i,Ny] |
1028 | 1032 | s[q] = -1 |
1029 | 1033 | q = q[-1]+i |
1030 | 1034 | ii[q] = G[i,j] |
1031 | | - jj[q] = G[i,Ny+2] |
| 1035 | + jj[q] = G[i,Ny+1] |
1032 | 1036 | s[q] = -1 |
1033 | 1037 | BCRHS[G[i,j]] = 0 |
1034 | 1038 |
|
@@ -1058,6 +1062,8 @@ def boundaryConditionsTerm2D(BC: BoundaryConditions2D): |
1058 | 1062 | s[q] = -(BC.left.b/2 - BC.left.a/dx_1) |
1059 | 1063 | BCRHS[G[i,j]] = -BC.left.c |
1060 | 1064 | elif BC.right.periodic or BC.left.periodic: # periodic boundary condition |
| 1065 | + if (type(BC.domain) is CylindricalGrid2D): |
| 1066 | + raise ValueError("Radial periodic boundary conditions are not physically meaningful.") |
1061 | 1067 | # Right boundary |
1062 | 1068 | i = Nx+1 |
1063 | 1069 | j = int_range(1, Ny) |
@@ -1262,7 +1268,7 @@ def boundaryConditionsTerm3D(BC: BoundaryConditions3D): |
1262 | 1268 | ii[q] = G[i,j,k].ravel() |
1263 | 1269 | jj[q] = G[0,j,k].ravel() |
1264 | 1270 | s[q] = dx_end/dx_1 |
1265 | | - q = q[-1]+int_range[1,Ny*Nz] |
| 1271 | + q = q[-1]+int_range(1,Ny*Nz) |
1266 | 1272 | ii[q] = G[i,j,k].ravel() |
1267 | 1273 | jj[q] = G[1,j,k].ravel() |
1268 | 1274 | s[q] = -dx_end/dx_1 |
@@ -1454,11 +1460,11 @@ def boundaryConditionsTermPolar2D(BC: BoundaryConditions2D): |
1454 | 1460 | s[q] = 1 |
1455 | 1461 | q = q[-1]+i |
1456 | 1462 | ii[q] = G[i,j] |
1457 | | - jj[q] = G[i,Ny+1] |
| 1463 | + jj[q] = G[i,Ny] |
1458 | 1464 | s[q] = -1 |
1459 | 1465 | q = q[-1]+i |
1460 | 1466 | ii[q] = G[i,j] |
1461 | | - jj[q] = G[i,Ny+2] |
| 1467 | + jj[q] = G[i,Ny+1] |
1462 | 1468 | s[q] = -1 |
1463 | 1469 | BCRHS[G[i,j]] = 0 |
1464 | 1470 |
|
@@ -1488,45 +1494,53 @@ def boundaryConditionsTermPolar2D(BC: BoundaryConditions2D): |
1488 | 1494 | s[q] = -(BC.left.b/2 - BC.left.a/dx_1) |
1489 | 1495 | BCRHS[G[i,j]] = -BC.left.c |
1490 | 1496 | elif BC.right.periodic or BC.left.periodic: # periodic boundary condition |
1491 | | - # Right boundary |
1492 | | - i = Nx+1 |
1493 | | - j = int_range(1, Ny) |
1494 | | - q = q[-1]+j |
1495 | | - ii[q] = G[i,j] |
1496 | | - jj[q] = G[i,j] |
1497 | | - s[q] = 1 |
1498 | | - q = q[-1]+j |
1499 | | - ii[q] = G[i,j] |
1500 | | - jj[q] = G[i-1,j] |
1501 | | - s[q] = -1 |
1502 | | - q = q[-1]+j |
1503 | | - ii[q] = G[i,j] |
1504 | | - jj[q] = G[0,j] |
1505 | | - s[q] = dx_end/dx_1 |
1506 | | - q = q[-1]+j |
1507 | | - ii[q] = G[i,j] |
1508 | | - jj[q] = G[1,j] |
1509 | | - s[q] = -dx_end/dx_1 |
1510 | | - BCRHS[G[i,j]] = 0 |
1511 | | - # Left boundary |
1512 | | - i = 0 |
1513 | | - q = q[-1]+j |
1514 | | - ii[q] = G[i,j] |
1515 | | - jj[q] = G[i,j] |
1516 | | - s[q] = 1.0 |
1517 | | - q = q[-1]+j |
1518 | | - ii[q] = G[i,j] |
1519 | | - jj[q] = G[i+1,j] |
1520 | | - s[q] = 1.0 |
1521 | | - q = q[-1]+j |
1522 | | - ii[q] = G[i,j] |
1523 | | - jj[q] = G[Nx,j] |
1524 | | - s[q] = -1.0 |
1525 | | - q = q[-1]+j |
1526 | | - ii[q] = G[i,j] |
1527 | | - jj[q] = G[Nx+1,j] |
1528 | | - s[q] = -1.0 |
1529 | | - BCRHS[G[i,j]] = 0.0 |
| 1497 | + raise ValueError("Radial periodic boundary conditions are not physically meaningful.") |
| 1498 | + # |
| 1499 | + # Keep the following code for future reference, once a physically relevant |
| 1500 | + # case has been identified for radial periodic BCs... |
| 1501 | + # |
| 1502 | + # # Right boundary |
| 1503 | + # i = Nx+1 |
| 1504 | + # j = int_range(1, Ny) |
| 1505 | + # q = q[-1]+j |
| 1506 | + # ii[q] = G[i,j] |
| 1507 | + # jj[q] = G[i,j] |
| 1508 | + # s[q] = 1 |
| 1509 | + # q = q[-1]+j |
| 1510 | + # ii[q] = G[i,j] |
| 1511 | + # jj[q] = G[i-1,j] |
| 1512 | + # s[q] = -1 |
| 1513 | + # q = q[-1]+j |
| 1514 | + # ii[q] = G[i,j] |
| 1515 | + # jj[q] = G[0,j] |
| 1516 | + # s[q] = dx_end/dx_1 |
| 1517 | + # q = q[-1]+j |
| 1518 | + # ii[q] = G[i,j] |
| 1519 | + # jj[q] = G[1,j] |
| 1520 | + # s[q] = -dx_end/dx_1 |
| 1521 | + # BCRHS[G[i,j]] = 0 |
| 1522 | + # # Left boundary |
| 1523 | + # i = 0 |
| 1524 | + # q = q[-1]+j |
| 1525 | + # ii[q] = G[i,j] |
| 1526 | + # jj[q] = G[i,j] |
| 1527 | + # s[q] = 1.0 |
| 1528 | + # q = q[-1]+j |
| 1529 | + # ii[q] = G[i,j] |
| 1530 | + # jj[q] = G[i+1,j] |
| 1531 | + # s[q] = 1.0 |
| 1532 | + # q = q[-1]+j |
| 1533 | + # ii[q] = G[i,j] |
| 1534 | + # jj[q] = G[Nx,j] |
| 1535 | + # s[q] = -1.0 |
| 1536 | + # q = q[-1]+j |
| 1537 | + # ii[q] = G[i,j] |
| 1538 | + # jj[q] = G[Nx+1,j] |
| 1539 | + # s[q] = -1.0 |
| 1540 | + # BCRHS[G[i,j]] = 0.0 |
| 1541 | + # |
| 1542 | + # |
| 1543 | + # |
1530 | 1544 | # Build the sparse matrix of the boundary conditions |
1531 | 1545 | q = q[-1] + 1 |
1532 | 1546 | BCMatrix = csr_array((s[0:q], (ii[0:q], jj[0:q])), |
@@ -1677,49 +1691,57 @@ def boundaryConditionsTermCylindrical3D(BC: BoundaryConditions3D): |
1677 | 1691 | s[q] = -(BC.left.b/2 - BC.left.a/dx_1).ravel() |
1678 | 1692 | BCRHS[G[i,j,k].ravel()] = -(BC.left.c).ravel() |
1679 | 1693 | elif BC.right.periodic or BC.left.periodic: # periodic |
1680 | | - # Right boundary |
1681 | | - i=Nx+1 |
1682 | | - j=j_ind |
1683 | | - k=k_ind |
1684 | | - q = q[-1]+int_range(1,Ny*Nz) |
1685 | | - ii[q] = G[i,j,k].ravel() |
1686 | | - jj[q] = G[i,j,k].ravel() |
1687 | | - s[q] = 1.0 |
1688 | | - q = q[-1]+int_range(1,Ny*Nz) |
1689 | | - ii[q] = G[i,j,k].ravel() |
1690 | | - jj[q] = G[i-1,j,k].ravel() |
1691 | | - s[q] = -1.0 |
1692 | | - q = q[-1]+int_range(1,Ny*Nz) |
1693 | | - ii[q] = G[i,j,k].ravel() |
1694 | | - jj[q] = G[0,j,k].ravel() |
1695 | | - s[q] = dx_end/dx_1 |
1696 | | - q = q[-1]+int_range[1,Ny*Nz] |
1697 | | - ii[q] = G[i,j,k].ravel() |
1698 | | - jj[q] = G[1,j,k].ravel() |
1699 | | - s[q] = -dx_end/dx_1 |
1700 | | - BCRHS[G[i,j,k].ravel()] = 0.0 |
1701 | | - |
1702 | | - # Left boundary |
1703 | | - i = 0 |
1704 | | - j=j_ind |
1705 | | - k=k_ind |
1706 | | - q = q[-1]+int_range(1,Ny*Nz) |
1707 | | - ii[q] = G[i,j,k].ravel() |
1708 | | - jj[q] = G[i,j,k].ravel() |
1709 | | - s[q] = 1.0 |
1710 | | - q = q[-1]+int_range(1,Ny*Nz) |
1711 | | - ii[q] = G[i,j,k].ravel() |
1712 | | - jj[q] = G[i+1,j,k].ravel() |
1713 | | - s[q] = 1.0 |
1714 | | - q = q[-1]+int_range(1,Ny*Nz) |
1715 | | - ii[q] = G[i,j,k].ravel() |
1716 | | - jj[q] = G[Nx,j,k].ravel() |
1717 | | - s[q] = -1.0 |
1718 | | - q = q[-1]+int_range(1,Ny*Nz) |
1719 | | - ii[q] = G[i,j,k].ravel() |
1720 | | - jj[q] = G[Nx+1,j,k].ravel() |
1721 | | - s[q] = -1.0 |
1722 | | - BCRHS[G[i,j,k].ravel()] = 0.0 |
| 1694 | + raise ValueError("Radial periodic boundary conditions are not physically meaningful.") |
| 1695 | + # |
| 1696 | + # Keep the following code for future reference, once a physically relevant |
| 1697 | + # case has been identified for radial periodic BCs... |
| 1698 | + # |
| 1699 | + # # Right boundary |
| 1700 | + # i=Nx+1 |
| 1701 | + # j=j_ind |
| 1702 | + # k=k_ind |
| 1703 | + # q = q[-1]+int_range(1,Ny*Nz) |
| 1704 | + # ii[q] = G[i,j,k].ravel() |
| 1705 | + # jj[q] = G[i,j,k].ravel() |
| 1706 | + # s[q] = 1.0 |
| 1707 | + # q = q[-1]+int_range(1,Ny*Nz) |
| 1708 | + # ii[q] = G[i,j,k].ravel() |
| 1709 | + # jj[q] = G[i-1,j,k].ravel() |
| 1710 | + # s[q] = -1.0 |
| 1711 | + # q = q[-1]+int_range(1,Ny*Nz) |
| 1712 | + # ii[q] = G[i,j,k].ravel() |
| 1713 | + # jj[q] = G[0,j,k].ravel() |
| 1714 | + # s[q] = dx_end/dx_1 |
| 1715 | + # q = q[-1]+int_range(1,Ny*Nz) |
| 1716 | + # ii[q] = G[i,j,k].ravel() |
| 1717 | + # jj[q] = G[1,j,k].ravel() |
| 1718 | + # s[q] = -dx_end/dx_1 |
| 1719 | + # BCRHS[G[i,j,k].ravel()] = 0.0 |
| 1720 | + |
| 1721 | + # # Left boundary |
| 1722 | + # i = 0 |
| 1723 | + # j=j_ind |
| 1724 | + # k=k_ind |
| 1725 | + # q = q[-1]+int_range(1,Ny*Nz) |
| 1726 | + # ii[q] = G[i,j,k].ravel() |
| 1727 | + # jj[q] = G[i,j,k].ravel() |
| 1728 | + # s[q] = 1.0 |
| 1729 | + # q = q[-1]+int_range(1,Ny*Nz) |
| 1730 | + # ii[q] = G[i,j,k].ravel() |
| 1731 | + # jj[q] = G[i+1,j,k].ravel() |
| 1732 | + # s[q] = 1.0 |
| 1733 | + # q = q[-1]+int_range(1,Ny*Nz) |
| 1734 | + # ii[q] = G[i,j,k].ravel() |
| 1735 | + # jj[q] = G[Nx,j,k].ravel() |
| 1736 | + # s[q] = -1.0 |
| 1737 | + # q = q[-1]+int_range(1,Ny*Nz) |
| 1738 | + # ii[q] = G[i,j,k].ravel() |
| 1739 | + # jj[q] = G[Nx+1,j,k].ravel() |
| 1740 | + # s[q] = -1.0 |
| 1741 | + # BCRHS[G[i,j,k].ravel()] = 0.0 |
| 1742 | + # |
| 1743 | + # |
| 1744 | + # |
1723 | 1745 | if (not BC.front.periodic) and (not BC.back.periodic): |
1724 | 1746 | # Front boundary |
1725 | 1747 | k=Nz+1 |
@@ -1943,52 +1965,57 @@ def boundaryConditionsTermSpherical3D(BC: BoundaryConditions3D): |
1943 | 1965 | s[q] = -(BC.left.b/2 - BC.left.a/dx_1).ravel() |
1944 | 1966 | BCRHS[G[i,j,k].ravel()] = -(BC.left.c).ravel() |
1945 | 1967 | elif BC.right.periodic or BC.left.periodic: # periodic |
1946 | | - # for a spherical coordinate system, the left and right boundaries (in the radial direction) cannot be periodic? |
1947 | | - # or at least I cannot imagine them being periodic |
1948 | | - # TODO: add a warning here; do the same for all radial boundaries |
1949 | | - # Right boundary |
1950 | | - i=Nx+1 |
1951 | | - j=j_ind |
1952 | | - k=k_ind |
1953 | | - q = q[-1]+int_range(1,Ny*Nz) |
1954 | | - ii[q] = G[i,j,k].ravel() |
1955 | | - jj[q] = G[i,j,k].ravel() |
1956 | | - s[q] = 1.0 |
1957 | | - q = q[-1]+int_range(1,Ny*Nz) |
1958 | | - ii[q] = G[i,j,k].ravel() |
1959 | | - jj[q] = G[i-1,j,k].ravel() |
1960 | | - s[q] = -1.0 |
1961 | | - q = q[-1]+int_range(1,Ny*Nz) |
1962 | | - ii[q] = G[i,j,k].ravel() |
1963 | | - jj[q] = G[0,j,k].ravel() |
1964 | | - s[q] = dx_end/dx_1 |
1965 | | - q = q[-1]+int_range[1,Ny*Nz] |
1966 | | - ii[q] = G[i,j,k].ravel() |
1967 | | - jj[q] = G[1,j,k].ravel() |
1968 | | - s[q] = -dx_end/dx_1 |
1969 | | - BCRHS[G[i,j,k].ravel()] = 0.0 |
1970 | | - |
1971 | | - # Left boundary |
1972 | | - i = 0 |
1973 | | - j=j_ind |
1974 | | - k=k_ind |
1975 | | - q = q[-1]+int_range(1,Ny*Nz) |
1976 | | - ii[q] = G[i,j,k].ravel() |
1977 | | - jj[q] = G[i,j,k].ravel() |
1978 | | - s[q] = 1.0 |
1979 | | - q = q[-1]+int_range(1,Ny*Nz) |
1980 | | - ii[q] = G[i,j,k].ravel() |
1981 | | - jj[q] = G[i+1,j,k].ravel() |
1982 | | - s[q] = 1.0 |
1983 | | - q = q[-1]+int_range(1,Ny*Nz) |
1984 | | - ii[q] = G[i,j,k].ravel() |
1985 | | - jj[q] = G[Nx,j,k].ravel() |
1986 | | - s[q] = -1.0 |
1987 | | - q = q[-1]+int_range(1,Ny*Nz) |
1988 | | - ii[q] = G[i,j,k].ravel() |
1989 | | - jj[q] = G[Nx+1,j,k].ravel() |
1990 | | - s[q] = -1.0 |
1991 | | - BCRHS[G[i,j,k].ravel()] = 0.0 |
| 1968 | + raise ValueError("Radial periodic boundary conditions are not physically meaningful.") |
| 1969 | + # |
| 1970 | + # Keep the following code for future reference, once a physically relevant |
| 1971 | + # case has been identified for radial periodic BCs... |
| 1972 | + # |
| 1973 | + # # Right boundary |
| 1974 | + # i=Nx+1 |
| 1975 | + # j=j_ind |
| 1976 | + # k=k_ind |
| 1977 | + # q = q[-1]+int_range(1,Ny*Nz) |
| 1978 | + # ii[q] = G[i,j,k].ravel() |
| 1979 | + # jj[q] = G[i,j,k].ravel() |
| 1980 | + # s[q] = 1.0 |
| 1981 | + # q = q[-1]+int_range(1,Ny*Nz) |
| 1982 | + # ii[q] = G[i,j,k].ravel() |
| 1983 | + # jj[q] = G[i-1,j,k].ravel() |
| 1984 | + # s[q] = -1.0 |
| 1985 | + # q = q[-1]+int_range(1,Ny*Nz) |
| 1986 | + # ii[q] = G[i,j,k].ravel() |
| 1987 | + # jj[q] = G[0,j,k].ravel() |
| 1988 | + # s[q] = dx_end/dx_1 |
| 1989 | + # q = q[-1]+int_range(1,Ny*Nz) |
| 1990 | + # ii[q] = G[i,j,k].ravel() |
| 1991 | + # jj[q] = G[1,j,k].ravel() |
| 1992 | + # s[q] = -dx_end/dx_1 |
| 1993 | + # BCRHS[G[i,j,k].ravel()] = 0.0 |
| 1994 | + |
| 1995 | + # # Left boundary |
| 1996 | + # i = 0 |
| 1997 | + # j=j_ind |
| 1998 | + # k=k_ind |
| 1999 | + # q = q[-1]+int_range(1,Ny*Nz) |
| 2000 | + # ii[q] = G[i,j,k].ravel() |
| 2001 | + # jj[q] = G[i,j,k].ravel() |
| 2002 | + # s[q] = 1.0 |
| 2003 | + # q = q[-1]+int_range(1,Ny*Nz) |
| 2004 | + # ii[q] = G[i,j,k].ravel() |
| 2005 | + # jj[q] = G[i+1,j,k].ravel() |
| 2006 | + # s[q] = 1.0 |
| 2007 | + # q = q[-1]+int_range(1,Ny*Nz) |
| 2008 | + # ii[q] = G[i,j,k].ravel() |
| 2009 | + # jj[q] = G[Nx,j,k].ravel() |
| 2010 | + # s[q] = -1.0 |
| 2011 | + # q = q[-1]+int_range(1,Ny*Nz) |
| 2012 | + # ii[q] = G[i,j,k].ravel() |
| 2013 | + # jj[q] = G[Nx+1,j,k].ravel() |
| 2014 | + # s[q] = -1.0 |
| 2015 | + # BCRHS[G[i,j,k].ravel()] = 0.0 |
| 2016 | + # |
| 2017 | + # |
| 2018 | + # |
1992 | 2019 | if (not BC.front.periodic) and (not BC.back.periodic): |
1993 | 2020 | # Front boundary |
1994 | 2021 | k=Nz+1 |
@@ -2068,6 +2095,8 @@ def boundaryConditionsTermSpherical3D(BC: BoundaryConditions3D): |
2068 | 2095 | shape=((Nx+2)*(Ny+2)*(Nz+2), (Nx+2)*(Ny+2)*(Nz+2))) |
2069 | 2096 | return BCMatrix, BCRHS |
2070 | 2097 |
|
| 2098 | + |
| 2099 | + |
2071 | 2100 | def boundaryConditionsTerm(BC): |
2072 | 2101 | """ |
2073 | 2102 | Generate the terms of the matrix equation representing the boundary conditions |
|
0 commit comments