server_t *create_server(int port, const char *localSocketName, int localSocketMode, int flags) { server_t *srv; SAIN ssa; int reuse, ss; #ifdef HAVE_IPV6 struct sockaddr_in6 ssa6; #endif struct sockaddr_un lusa; #ifdef RSERV_DEBUG printf(" - create_server(port = %d, socket = %s, mode = %d, flags = 0x%x)\n", port, localSocketName ? localSocketName : "<NULL>", localSocketMode, flags); #endif initsocks(); if (localSocketName) { #ifndef unix RSEprintf("ERROR: Local sockets are not supported on non-unix systems.\n"); return 0; #else ss = FCF("open socket", socket(AF_LOCAL, SOCK_STREAM, 0)); memset(&lusa, 0, sizeof(lusa)); lusa.sun_family = AF_LOCAL; if (strlen(localSocketName) > sizeof(lusa.sun_path) - 2) { RSEprintf("ERROR: Local socket name is too long for this system.\n"); return 0; } strcpy(lusa.sun_path, localSocketName); remove(localSocketName); /* remove existing if possible */ #endif } else #ifdef HAVE_IPV6 ss = FCF("open socket", socket((flags & SRV_IPV6) ? AF_INET6 : AF_INET, SOCK_STREAM, 0)); #else ss = FCF("open socket", socket(AF_INET, SOCK_STREAM, 0)); #endif srv = (server_t*) calloc(1, sizeof(server_t)); if (!srv) { RSEprintf("ERROR: cannot allocate memory for server structure\n"); return 0; } srv->ss = ss; srv->unix_socket = localSocketName ? 1 : 0; srv->flags = flags; srv->parent = 0; reuse = 1; /* enable socket address reusage */ setsockopt(ss, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuse, sizeof(reuse)); #ifdef unix if (localSocketName) { FCF("bind", bind(ss, (SA*) &lusa, sizeof(lusa))); if (localSocketMode) chmod(localSocketName, localSocketMode); } else { #endif #ifdef HAVE_IPV6 if (flags & SRV_IPV6) { memset(&ssa6, 0, sizeof(ssa6)); ssa6.sin6_family = AF_INET6; ssa6.sin6_port = htons(port); ssa6.sin6_addr = (flags & SRV_LOCAL) ? in6addr_loopback : in6addr_any; FCF("bind", bind(ss, (struct sockaddr*) &ssa6, sizeof(ssa6))); } else { #endif memset(&ssa, 0, sizeof(ssa)); ssa.sin_family = AF_INET; ssa.sin_port = htons(port); ssa.sin_addr.s_addr = htonl((flags & SRV_LOCAL) ? INADDR_LOOPBACK : INADDR_ANY); FCF("bind", bind(ss, (struct sockaddr*) &ssa, sizeof(ssa))); #ifdef HAVE_IPV6 } /* if (flags & SRV_IPV6) else */ #endif #ifdef unix } /* if (localSocketName) else */ #endif add_active_srv_socket(ss); FCF("listen", listen(ss, LISTENQ)); return srv; }
void SSPquad::GetStab(void) // this function computes the stabilization stiffness matrix for the element { Vector g1(SSPQ_NUM_DIM); Vector g2(SSPQ_NUM_DIM); Matrix I(SSPQ_NUM_DIM,SSPQ_NUM_DIM); Matrix FCF(SSPQ_NUM_DIM,SSPQ_NUM_DIM); Matrix Jmat(SSPQ_NUM_DIM,SSPQ_NUM_DIM); Matrix Jinv(SSPQ_NUM_DIM,SSPQ_NUM_DIM); Matrix dNloc(SSPQ_NUM_NODE,SSPQ_NUM_DIM); Matrix dN(SSPQ_NUM_NODE,SSPQ_NUM_DIM); Matrix Mben(2,SSPQ_NUM_DOF); double Hss; double Hst; double Htt; // shape function derivatives (local crd) at center dNloc(0,0) = -0.25; dNloc(1,0) = 0.25; dNloc(2,0) = 0.25; dNloc(3,0) = -0.25; dNloc(0,1) = -0.25; dNloc(1,1) = -0.25; dNloc(2,1) = 0.25; dNloc(3,1) = 0.25; // jacobian matrix Jmat = mNodeCrd*dNloc; // inverse of the jacobian matrix Jmat.Invert(Jinv); // shape function derivatives (global crd) dN = dNloc*Jinv; // define hourglass stabilization vector gamma = 0.25*(h - (h^x)*bx - (h^y)*by); double hx = mNodeCrd(0,0) - mNodeCrd(0,1) + mNodeCrd(0,2) - mNodeCrd(0,3); double hy = mNodeCrd(1,0) - mNodeCrd(1,1) + mNodeCrd(1,2) - mNodeCrd(1,3); double gamma[4]; gamma[0] = 0.25*( 1.0 - hx*dN(0,0) - hy*dN(0,1)); gamma[1] = 0.25*(-1.0 - hx*dN(1,0) - hy*dN(1,1)); gamma[2] = 0.25*( 1.0 - hx*dN(2,0) - hy*dN(2,1)); gamma[3] = 0.25*(-1.0 - hx*dN(3,0) - hy*dN(3,1)); // define mapping matrices Mmem.Zero(); Mben.Zero(); for (int i = 0; i < 4; i++) { Mmem(0,2*i) = dN(i,0); Mmem(1,2*i+1) = dN(i,1); Mmem(2,2*i) = dN(i,1); Mmem(2,2*i+1) = dN(i,0); Mben(0,2*i) = gamma[i]; Mben(1,2*i+1) = gamma[i]; } // base vectors g1(0) = Jmat(0,0); g1(1) = Jmat(1,0); g2(0) = Jmat(0,1); g2(1) = Jmat(1,1); // normalize base vectors g1.Normalize(); g2.Normalize(); // compute second moment of area tensor double fourThree = 4.0/3.0; I = fourThree*mThickness*J0*(DyadicProd(g1,g1) + DyadicProd(g2,g2)); // stabilization terms Hss = (I(0,0)*Jinv(1,0)*Jinv(1,0) + I(0,1)*Jinv(0,0)*Jinv(1,0) + I(1,1)*Jinv(0,0)*Jinv(0,0))*0.25; Htt = (I(0,0)*Jinv(1,1)*Jinv(1,1) + I(0,1)*Jinv(0,1)*Jinv(1,1) + I(1,1)*Jinv(0,1)*Jinv(0,1))*0.25; Hst = (I(0,0)*Jinv(1,1)*Jinv(1,0) + I(0,1)*(Jinv(1,0)*Jinv(0,1) + Jinv(1,1)*Jinv(0,0)) + I(1,1)*Jinv(0,1)*Jinv(0,0))*0.25; // get material tangent const Matrix &CmatI = theMaterial->getInitialTangent(); // compute stabilization matrix FCF(0,0) = (CmatI(0,0) - (CmatI(0,1) + CmatI(1,0)) + CmatI(1,1))*Hss; FCF(0,1) = (CmatI(0,1) - (CmatI(0,0) + CmatI(1,1)) + CmatI(1,0))*Hst; FCF(1,0) = (CmatI(1,0) - (CmatI(0,0) + CmatI(1,1)) + CmatI(0,1))*Hst; FCF(1,1) = (CmatI(1,1) - (CmatI(0,1) + CmatI(1,0)) + CmatI(0,0))*Htt; // compute stiffness matrix for stabilization terms Kstab.Zero(); Kstab.addMatrixTripleProduct(1.0, Mben, FCF, 1.0); return; }