#include <stdio.h>

double caldet(double f[][3]);
double keisuu(double xy[][2],double abc[][3]);
void makeN(double abc[][3],double a2det,double n[][6],double x,double y);
void makeB(double abc[][3],double a2det,double b[][6]);
void makeD(double young,double nyu,double d[][3]);
void calsigma(double sigma[3],double d[][3],double ep[]);


int main(void)
{
    double abc[3][3];
    double xy[3][2];
    double u1,v1,u2,v2,u3,v3;
    double a2det;
    double a[3][3];
    double n[2][6];
    double x,y;
    double ux,uy;
    double b[3][6];
    double ep[3];
    double young,nyu;
    double d[3][3];
    double sigma[3];

    //三角形の各点の座標値ここから
    xy[0][0]=0.0;
    xy[0][1]=0.0;
    xy[1][0]=10.0;
    xy[1][1]=0.0;
    xy[2][0]=0.0;
    xy[2][1]=5.0;
    //三角形の各点の座標値ここまで

    a2det=keisuu(xy,abc);//keisuuをつくる

    x=10.0;//求めたいx座標
    y=0.0;//求めたいy座標
    
    makeN(abc,a2det,n,x,y);//Nマトリックスをつくる

    //検証するための変位ここから
    u1=0.0;
    v1=0.0;
    u2=4.0;
    v2=0.0;
    u3=0.0;
    v3=0.0;
    //検証するための変位ここまで
    
    ux=n[0][0]*u1+n[0][2]*u2+n[0][4]*u3;
    uy=n[1][1]*v1+n[1][3]*v2+n[1][5]*v3;
    
    printf("ux=%lf uy=%lf\n",ux,uy);

    makeB(abc,a2det,b);//Bマトリックスをつくる

    ep[0]=b[0][0]*u1+b[0][1]*v1+b[0][2]*u2+b[0][3]*v2+b[0][4]*u3+b[0][5]*v3;
    ep[1]=b[1][0]*u1+b[1][1]*v1+b[1][2]*u2+b[1][3]*v2+b[1][4]*u3+b[1][5]*v3;
    ep[2]=b[2][0]*u1+b[2][1]*v1+b[2][2]*u2+b[2][3]*v2+b[2][4]*u3+b[2][5]*v3;

    printf("exx=%10.2lf eyy=%10.2lf exy=%10.2lf\n",ep[0],ep[1],ep[2]);

    young=21000;
    nyu=0.3;

    makeD(young,nyu,d);//Dマトリックスをつくる

    calsigma(sigma,d,ep);//応力計算(calculate stress)

    return 0;
}


double caldet(double f[][3])
{
    double det;
    
det=f[0][0]*f[1][1]*f[2][2]+
    f[1][0]*f[2][1]*f[0][2]+
    f[2][0]*f[1][2]*f[0][1]-
    f[0][2]*f[1][1]*f[2][0]-
    f[0][0]*f[2][1]*f[1][2]-
    f[0][1]*f[1][0]*f[2][2];

    printf("%10.2lf\n",det);    

    return det;
}


double keisuu(double xy[][2],double abc[][3])
{
    double a2det;
    double a[3][3];

    abc[0][0]=xy[1][0]*xy[2][1]-xy[2][0]*xy[1][1];
    abc[0][1]=xy[1][1]-xy[2][1];
    abc[0][2]=xy[2][0]-xy[1][0];
    abc[1][0]=xy[2][0]*xy[0][1]-xy[0][0]*xy[2][1];
    abc[1][1]=xy[2][1]-xy[0][1];
    abc[1][2]=xy[0][0]-xy[2][0];
    abc[2][0]=xy[0][0]*xy[1][1]-xy[1][0]*xy[0][1];
    abc[2][1]=xy[0][1]-xy[1][1];
    abc[2][2]=xy[1][0]-xy[0][0];

    a[0][0]=1.0;
    a[1][0]=1.0;
    a[2][0]=1.0;
    a[0][1]=xy[0][0];
    a[1][1]=xy[1][0];
    a[2][1]=xy[2][0];
    a[0][2]=xy[0][1];
    a[1][2]=xy[1][1];
    a[2][2]=xy[2][1];

    a2det=caldet(a);

    return a2det;
}


void makeN(double abc[][3],double a2det,double n[][6],double x,double y)
{
    double n1,n2,n3;

    n1=(abc[0][0]+abc[0][1]*x+abc[0][2]*y)/a2det;
    n2=(abc[1][0]+abc[1][1]*x+abc[1][2]*y)/a2det;
    n3=(abc[2][0]+abc[2][1]*x+abc[2][2]*y)/a2det;

    n[0][0]=n1;
    n[0][1]=0.0;
    n[0][2]=n2;
    n[0][3]=0.0;
    n[0][4]=n3;
    n[0][5]=0.0;
    n[1][0]=0.0;
    n[1][1]=n1;
    n[1][2]=0.0;
    n[1][3]=n2;
    n[1][4]=0.0;
    n[1][5]=n3;

}


void makeB(double abc[][3],double a2det,double b[][6])
{
    double dn1dx,dn2dx,dn3dx;
    double dn1dy,dn2dy,dn3dy;

    dn1dx=abc[0][1]/a2det;
    dn2dx=abc[1][1]/a2det;
    dn3dx=abc[2][1]/a2det;
    dn1dy=abc[0][2]/a2det;
    dn2dy=abc[1][2]/a2det;
    dn3dy=abc[2][2]/a2det;
    
    b[0][0]=dn1dx;
    b[0][1]=0.0;
    b[0][2]=dn2dx;
    b[0][3]=0.0;
    b[0][4]=dn3dx;
    b[0][5]=0.0;
    b[1][0]=0.0;
    b[1][1]=dn1dy;
    b[1][2]=0.0;
    b[1][3]=dn2dy;
    b[1][4]=0.0;
    b[1][5]=dn3dy;
    b[2][0]=dn1dy;
    b[2][1]=dn1dx;
    b[2][2]=dn2dy;
    b[2][3]=dn2dx;
    b[2][4]=dn3dy;
    b[2][5]=dn3dx;

}


void makeD(double young,double nyu,double d[][3])
{
    double c;
    
    c=young/(1-nyu*nyu);

    d[0][0]=c*1.0;
    d[0][1]=c*nyu;
    d[0][2]=0.0;
    d[1][0]=c*nyu;
    d[1][1]=c*1.0;
    d[1][2]=0.0;
    d[2][0]=0.0;
    d[2][1]=0.0;
    d[2][2]=c*(1-nyu)/2;
}


void calsigma(double sigma[],double d[][3],double ep[])
{
    sigma[0]=d[0][0]*ep[0]+d[0][1]*ep[1]+d[0][2]*ep[2];
    sigma[1]=d[1][0]*ep[0]+d[1][1]*ep[1]+d[1][2]*ep[2];
    sigma[2]=d[2][0]*ep[0]+d[2][1]*ep[1]+d[2][2]*ep[2];

    printf("sxx=%10.2lf syy=%10.2lf sxy=%10.2lf\n",sigma[0],sigma[1],sigma[2]);
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: