⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fe_matrix.c

📁 矩阵运算〉〉 〉〉 〉〉 〉〉 。
💻 C
📖 第 1 页 / 共 5 页
字号:
1421: ARRAY    *p;
1422: QUANTITY *fvector, *pl;
1423: int      elmt_no;
1424: #endif
1425: {
1426: int      j,k;
1427: int      i,iid,ii;
1428: ELEMENT  *el;
1429: int      *ldofg;
1430: char     *el_type;
1431: int      elmt_attr_no;
1432: 
1433:     el           = &frp->element[elmt_no -1];
1434:     elmt_attr_no = el->elmt_attr_no;
1435:     el_type      = frp->eattr[elmt_attr_no-1].elmt_type;
1436:     ldofg        = frp->eattr[elmt_no-1].map_ldof_to_gdof;
1437: 
1438:     for(i=1;i<=p->nodes_per_elmt;i++){
1439:         ii  = el->node_connect[i];
1440:         iid = (ii-1) * frp->no_dof;
1441:         for(j = 1; j<= p->dof_per_node; j++){
1442:             k = ldofg[j-1];
1443:             if(k > 0)
1444:               fvector[iid + k].value += pl[(i-1)*p->dof_per_node+ j].value;
1445:         }
1446:     }
1447: 
1448:     return(fvector);
1449: }
1450: 
1451: /* =============================== */
1452: /* Function to Assemble Nodal Load */
1453: /* =============================== */
1454: 
1455: #ifdef __STDC__
1456: QUANTITY *Assemble_Nodal_Load(EFRAME *frp, QUANTITY *fv)
1457: #else
1458: QUANTITY *Assemble_Nodal_Load(frp, fv)
1459: EFRAME   *frp;
1460: QUANTITY *fv;
1461: #endif
1462: {
1463: NODE               *np;
1464: NODE_LOADS        *nlp;
1465: int i,node, dof, nload;
1466: 
1467:  /* Initialize load vector */
1468: 
1469:     for(dof=1; dof<=frp->no_eq; dof++)
1470:         fv[dof].value = 0.;
1471: 
1472:     for(nload = 1; nload <= frp->no_node_loads; nload++) {
1473:         nlp  = &frp->nforces[nload-1];
1474:         node = nlp->node_f;
1475:         for(i =1; i <= frp->no_dof; i++)
1476:             fv[(node -1) *  frp->no_dof + i ].value = nlp->fn[i].value;
1477:     }
1478: 
1479:     return (fv);
1480: }
1481: 
1482: /* ======================================= */
1483: /*   Function to Assemble  Gravity  Load   */
1484: /* ======================================= */
1485: 
1486: #ifdef __STDC__
1487: QUANTITY *Assemble_Gravity_Load(EFRAME *frp, QUANTITY *fv)
1488: #else
1489: QUANTITY *Assemble_Gravity_Load(frp, fv)
1490: EFRAME   *frp;
1491: QUANTITY *fv;
1492: #endif
1493: {
1494: NODE               *np;
1495: NODE_LOADS        *nlp;
1496: int i,node, dof, nload;
1497: 
1498:    /* FILL IN DETAILS LATER */
1499: 
1500:    return (fv);
1501: }
1502: 
1503: /* =========================================== */
1504: /*   Function to Apply the Boundary conditions */
1505: /*   to the global stiffness matrix            */
1506: /* =========================================== */
1507: 
1508: #ifdef __STDC__
1509: double **Boundary_Conditions(EFRAME *frp)
1510: #else
1511: double **Boundary_Conditions(frp)
1512: EFRAME *frp;
1513: #endif
1514: {
1515: NODE                *np;
1516: NODE_LOADS         *nlp;
1517: int  i,node, dof, nload;
1518: 
1519:    for(node=1;node<=frp->no_nodes;node++) {
1520:        np   = &frp->node[node-1];
1521:        for(i =1; i<= frp->no_dof; i++) {
1522:        if(np->bound_id[i] >0) {
1523:            for(dof=1;dof<=TDOF;dof++) {
1524:                K[dof][(node-1)*frp->no_dof +i] = 0.;
1525:                K[(node-1)*frp->no_dof + 1][dof] = 0.;
1526:            }
1527: 
1528:            K[(node-1)*frp->no_dof + 1][(node-1)*frp->no_dof+ 1] = 0.;
1529:            F[(node-1)*frp->no_dof + 1]   = 0.;
1530:        }
1531:        }
1532:    }
1533: 
1534:    return (K);
1535: }
1536: 
1537: /* ==================================== */
1538: /*   Function to compute nodal forces   */
1539: /* ==================================== */
1540: 
1541: #ifdef __STDC__
1542: QUANTITY *Nodal_Forces(EFRAME *frp)
1543: #else
1544: QUANTITY *Nodal_Forces(frp)
1545: EFRAME   *frp;
1546: #endif
1547: {
1548: int i,j;
1549: 
1550:     /* Initialize nodal force vector : Compute [K]*{d} = {Fn} */
1551: 
1552:      for(i=1; i<=TDOF; i++) Fn[i].value = 0.;
1553:          for(i=1;i<=TDOF;i++)
1554:          for(j=1;j<=TDOF;j++)
1555:              Fn[i].value += K[i][j]*d[j];
1556: 
1557:      return (Fn);
1558: }
1559: 
1560: /* =======================================  */
1561: /*   Function to Assemble  Centrifugal  Load*/
1562: /* =======================================  */
1563: 
1564: #ifdef __STDC__
1565: QUANTITY *Assemble_Ctrfgl_Load(EFRAME *frp, QUANTITY *fv)
1566: #else
1567: QUANTITY *Assemble_Ctrfgl_Load(frp,fv)
1568: EFRAME   *frp;
1569: QUANTITY *fv;
1570: #endif
1571: {
1572: NODE               *np;
1573: NODE_LOADS        *nlp;
1574: int i,node, dof, nload;
1575: 
1576:  /* to be changed */
1577: 
1578:    for(dof=1; dof<=frp->no_eq; dof++)
1579:       fv[dof].value   = 0.;
1580: 
1581:    for(nload = 1; nload <= frp->no_node_loads; nload++) {
1582: 
1583:      nlp  = &frp->nforces[nload-1];
1584:      node = nlp->node_f;
1585:          for(i =1; i <= frp->no_dof; i++)
1586:              fv[(node -1) *  frp->no_dof + i ].value = nlp->fn[i].value;
1587: 
1588:    }
1589: 
1590:    return (fv);
1591: }
1592: 
1593: 
1594: 
1595: /* Functions for design rule checking */
1596: 
1597: #ifdef __STDC__
1598: MATRIX *Get_Coord(MATRIX *m)
1599: #else
1600: MATRIX *Get_Coord(m)
1601: MATRIX *m;
1602: #endif
1603: {
1604: MATRIX *coord;
1605: int    nodeno;
1606: int        ii;
1607: 
1608: #ifdef DEBUG
1609:        printf("*** Enter Get_Coord()\n");
1610: #endif
1611: 
1612:        nodeno = (int) m->uMatrix.daa[0][0];
1613:        coord  = MatrixAllocIndirect("Node Coord", DOUBLE_ARRAY, 1, frame->no_dimen);
1614: 
1615:        if( CheckUnits() == ON ) {
1616:           for( ii=0 ; ii<frame->no_dimen ; ii++ ) {
1617:              coord->uMatrix.daa[0][ii] = frame->node[nodeno-1].coord[ii].value;
1618:              UnitsCopy( &(coord->spColUnits[ii]), frame->node[nodeno-1].coord[ii].dimen );
1619:           }
1620:           ZeroUnits( &(coord->spRowUnits[0]) );
1621:        }
1622:        else {
1623:           for( ii=0 ; ii<frame->no_dimen ; ii++ )
1624:              coord->uMatrix.daa[0][ii] = frame->node[nodeno-1].coord[ii].value;
1625:        }
1626: 
1627: #ifdef DEBUG
1628:        printf("*** Leave Get_Coord()\n");
1629: #endif
1630: 
1631:     return(coord);
1632: }
1633: 
1634: #ifdef __STDC__
1635: MATRIX *Get_Node(MATRIX *m)
1636: #else
1637: MATRIX *Get_Node(m)
1638: MATRIX *m;
1639: #endif
1640: {
1641: MATRIX *connect;
1642: int      elmtno;
1643: int          ii;
1644: 
1645: #ifdef DEBUG
1646:        printf("*** Enter Get_Node()\n");
1647: #endif
1648: 
1649:        elmtno   = (int) m->uMatrix.daa[0][0];
1650:        connect  = MatrixAllocIndirect("Node Connect", DOUBLE_ARRAY, 1, frame->no_nodes_per_elmt);
1651: 
1652:        if( CheckUnits() == ON ) {
1653:           for( ii=0 ; ii<frame->no_nodes_per_elmt ; ii++ ) {
1654:              connect->uMatrix.daa[0][ii] = (double) frame->element[elmtno-1].node_connect[ii];
1655:              ZeroUnits( &(connect->spColUnits[ii]) );
1656:           }
1657:           ZeroUnits( &(connect->spRowUnits[0]) );
1658:        }
1659:        else {
1660:           for( ii=0 ; ii<frame->no_nodes_per_elmt ; ii++ )
1661:              connect->uMatrix.daa[0][ii] = (double) frame->element[elmtno-1].node_connect[ii];
1662:        }
1663: 
1664: #ifdef DEBUG
1665:        printf("*** Leave Get_Node()\n");
1666: #endif
1667: 
1668:     return(connect);
1669: }
1670: 
1671: #ifdef __STDC__
1672: MATRIX *Get_Displ(MATRIX *m1, MATRIX *m2)
1673: #else
1674: MATRIX *Get_Displ(m1,m2)
1675: MATRIX *m1, *m2;
1676: #endif
1677: {
1678: MATRIX *displ;
1679: int    nodeno;
1680: int     ii,jj;
1681: int UNITS_SWITCH;
1682: 
1683: #ifdef DEBUG
1684:        printf("*** Enter Get_Displ()\n");
1685: #endif
1686: 
1687:        nodeno = (int) m1->uMatrix.daa[0][0];
1688:        displ  = MatrixAllocIndirect("Node Displ", DOUBLE_ARRAY, 1, frame->no_dof);
1689:        UNITS_SWITCH = CheckUnits();
1690: 
1691:           switch( UNITS_SWITCH ) {
1692:             case ON:
1693:                    for( ii=0 ; ii<frame->no_dof ; ii++ ) {
1694:                       jj = frame->node[nodeno-1].bound_id[ii];
1695:                       if(jj > 0) {
1696:                          if(m2->spRowUnits[jj-1].units_name != NULL ) {
1697:                             UnitsTypeConvert(&(m2->spRowUnits[jj-1]), UNITS_TYPE);
1698:                          }
1699:                          RadUnitsSimplify( &(m2->spRowUnits[jj-1]) );
1700:                          frame->node[nodeno-1].disp[ii].value = m2->uMatrix.daa[jj-1][0];
1701:                          UnitsCopy( frame->node[nodeno-1].disp[ii].dimen, &(m2->spRowUnits[jj-1]) );
1702:                       }
1703:                       else
1704:                          RadUnitsSimplify( frame->node[nodeno-1].disp[ii].dimen );
1705:                   }
1706:               break;
1707:            case OFF:
1708:                   for( ii=0 ; ii<frame->no_dof ; ii++){
1709:                      jj = frame->node[nodeno-1].bound_id[ii];
1710:                      if(jj > 0)
1711:                         frame->node[nodeno-1].disp[ii].value = m2->uMatrix.daa[jj-1][0];
1712:                   }
1713:               break;
1714:            default:
1715:               break;
1716:           }
1717: 
1718:        if( UNITS_SWITCH == ON ) {
1719:           for( ii=0 ; ii<frame->no_dof ; ii++ ) {
1720:              displ->uMatrix.daa[0][ii] = frame->node[nodeno-1].disp[ii].value;
1721:              UnitsCopy( &(displ->spColUnits[ii]), frame->node[nodeno-1].disp[ii].dimen );
1722:           }
1723:           ZeroUnits( &(displ->spRowUnits[0]) );
1724:        }
1725:        else {
1726:           for( ii=0 ; ii<frame->no_dof ; ii++ )
1727:              displ->uMatrix.daa[0][ii] = frame->node[nodeno-1].disp[ii].value;
1728:        }
1729: 
1730: #ifdef DEBUG
1731:        printf("*** Leave Get_Displ()\n");
1732: #endif
1733: 
1734:     return(displ);
1735: }
1736: 
1737: #ifdef __STDC__
1738: MATRIX *Get_Stress(MATRIX *m1, MATRIX *m2)
1739: #else
1740: MATRIX *Get_Stress(m1,m2)
1741: MATRIX *m1, *m2;
1742: #endif
1743: {
1744: MATRIX *stress;
1745: int    elmt_no;
1746: int UNITS_SWITCH;
1747: 
1748: ELEMENT        *ep;
1749: ELEMENT_ATTR   *eap;
1750: int node_no, elmt_attr_no;
1751: int  i,j,k,ii,jj;
1752: 
1753: #ifdef DEBUG
1754:        printf("*** Enter Get_Stress()\n");
1755: #endif
1756: 
1757:        elmt_no = (int) m1->uMatrix.daa[0][0];
1758:        stress  = MatrixAllocIndirect("Element Stress", DOUBLE_ARRAY, frame->no_nodes_per_elmt, frame->no_dof);
1759:        UNITS_SWITCH = CheckUnits();
1760: 
1761: #ifdef DEBUG
1762:         printf(" elmt No = %d \n", elmt_no);
1763: #endif
1764: 
1765:            array = Assign_p_Array(frame, elmt_no, array, STRESS);
1766:            array = elmlib(array, PROPTY);
1767: 
1768:            /* Transfer Fixed Displacements */
1769: 
1770:            ep           = &frame->element[elmt_no-1];
1771:            elmt_attr_no = ep->elmt_attr_no;  
1772:   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -