#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<malloc.h>

void A_Parameter(void);
void Coordinate(void); //该函数主要用于生成圆心坐标
void Arc(double R,double AngleTime,double DotX);
void GravityComponet(double *NetSoilStripWeight,double *ArcLength,double *ArcAngle,double r,double AngleTime);
void SafetyFactor(double MR,double MT,double R,double OneAngleTime);

#define Angle 180/(4*atan(1))
#define radian 4*atan(1)/180

double H_Distance=0;
int SoilStripNumber=0;     //土条数
int S_L_Number=0;          //将土层层数定义为全局变量
int numberone=0;

struct result{
    double Rdius;
    double Ks;
    double AngleTime;
    double Mr;    //抗滑力矩;
    double Mt;    //下滑力矩;
}Result;

struct AverageParameter{
     double VolumWeight;
     double FrictionAngle;
     double Cohesive;
     double Height;
}Average;

int main()

    A_Parameter();
    printf("输出加权平均后的土壤参数(容重 内摩擦角 黏聚力)和坡高\n");
    printf("%lf  %lf  %lf  %lf\n", Average .VolumWeight, Average .FrictionAngle, Average .Cohesive, Average.Height);
    Coordinate();       //该函数主要用于生成圆心坐标
    //printf("numberone is %d\n",numberone);0
    printf("输出结果\n");
    printf("根据瑞典条分法求得边坡安全系数K:  K=%.2lf\n",Result.Ks);
    printf("根据瑞典条分法求得滑移面半径R:  R=%.2lf\n",Result.Rdius);
printf("根据瑞典条分法求得圆心坐标(X,Y):  X=%.2lf  Y=%.2lf\n",-Result.Rdius*cos(Result.AngleTime*radian),Result.Rdius
*sin(Result.AngleTime*radian));
    printf("根据瑞典条分法求得抗滑力矩Mr:  Mr=%.2lf\n",Result.Mr);
    printf("根据瑞典条分法求得下滑力矩Mt:  Mt=%.2lf\n",Result.Mt);
    printf("根据瑞典条分法求得半径与水平面的夹角Angle:  Angle=%.2lf\n",Result.AngleTime);
   
    return 0;
}
void A_Parameter ()
{
    double *VolumWeight,*FrictionAngle;
    double *Cohesive,*Thickness;
int i=0,j=0;

printf("输入要划分的土条数\n");
    scanf("%d",&SoilStripNumber);
    printf("输入边坡水平距离\n");
    scanf("%lf",&H_Distance);
    printf("输入土层层数\n");
scanf("%d",&S_L_Number);

VolumWeight=(double *)calloc(S_L_Number,sizeof(double));
    FrictionAngle=(double *)calloc(S_L_Number,sizeof(double));
    Cohesive=(double *)calloc(S_L_Number,sizeof(double));
Thickness=(double *)calloc(S_L_Number,sizeof(double));

printf("输入各土层容重\n");
    while(i<S_L_Number){
        scanf("%lf",&(VolumWeight[i]));
        i++;
    }
    
    printf("输入各土层内摩擦角单位为度\n");
    for(j=0;j<S_L_Number;j++)
        scanf("%lf",&(FrictionAngle[j]));
       
    printf("输入各土层的黏聚力单位为千帕\n");   
    for(j=0;j<S_L_Number;j++)
        scanf("%lf",&(Cohesive[j]));
        
    printf("输入各土层的厚度单位为米\n");
    for(j=0;j<S_L_Number;j++)
        scanf("%lf",&(Thickness[j]));
        
    double T_VolumWeight=0,T_FrictionAngle=0;  //各层高度和各层参数乘积之和。
    double T_Cohesive=0,T_Thickness=0;         //各黏聚力和各层高度乘积之和。总的厚度。
    
    for(j=0;j<S_L_Number;j++)
        T_VolumWeight+=VolumWeight[j]*Thickness[j];      //计算各层重度与各层高度乘积之和
    
    for(j=0;j<S_L_Number;j++)
        T_FrictionAngle+=FrictionAngle[j]*Thickness[j];  //计算各层内摩擦角和各层高度乘积之和
        
    for(j=0;j<S_L_Number;j++)
        T_Cohesive+=Cohesive[j]*Thickness[j];  //计算各层黏聚力与各层高度乘积之和
   
    for(j=0;j<S_L_Number;j++)
        T_Thickness+=Thickness[j];  //计算总得土层厚度
    
    Average .VolumWeight=T_VolumWeight/T_Thickness;
    Average .FrictionAngle=T_FrictionAngle/T_Thickness;
    Average .Cohesive=T_Cohesive/T_Thickness;
    Average .Height=T_Thickness;
    
    free(VolumWeight);
    free(FrictionAngle);
    free(Cohesive);
    free(Thickness);
}
void Coordinate(void)
{
int i=0,j=0;
double a;
    double DotX=0,DotX1=0,AngleOne=0;;
    double DeltaR=0,R=0,AngleTime=0;
    DeltaR=(3*Average.Height)/200;
  
    DotX1=H_Distance;
    for(i=0;i<=200 ;i++){
        R=Average.Height+i*DeltaR;
        AngleOne=(asin(sqrt(pow(H_Distance,2)+pow(Average.Height,2))/(2*R))+atan(DotX1/Average.Height))*Angle;
        a=(90-AngleOne)/ SoilStripNumber;  
        //printf("\n");
        for(j=0;j<SoilStripNumber;j++){
            AngleTime=(AngleOne+j*a);
            DotX=sqrt(pow(R,2)-pow((Average.Height-(R*sin(AngleTime*radian))),2))-R*cos(AngleTime*radian);
            if((R*sin(AngleTime*radian)>=Average.Height)&&(DotX<=Average.Height)){
                //printf("  %.2lf",DotX);
                Arc (R,AngleTime,DotX);
            }
        }
    }

}
void Arc(double R,double AngleTime,double DotX)  
{
    int i=0;
    double AngleTimeOne=0,DeltaAngleTimeOne=0,AngleTimetwo=0;
    double Distance=0;
    double r=R,OneAngleTime=AngleTime;     //OneAngleTime做函数的实参;
    double *S_LineFy=0;  //直线部分的竖距
    double *ArcLength,*ArcAngle,*ArcX;
    double *ArcFy,*ArcSoilStripWeight;
    double *S_LineSoilStripWeight;
    double *NetSoilStripWeight;
   
    S_LineFy=(double *)calloc(SoilStripNumber,sizeof(double));
    ArcLength=(double *)calloc(SoilStripNumber,sizeof(double));
    ArcAngle=(double *)calloc(SoilStripNumber,sizeof(double));
    ArcX=(double *)calloc(SoilStripNumber,sizeof(double));
    ArcFy=(double *)calloc(SoilStripNumber,sizeof(double));
    ArcSoilStripWeight=(double *)calloc(SoilStripNumber,sizeof(double));
    S_LineSoilStripWeight=(double *)calloc(SoilStripNumber,sizeof(double));
    NetSoilStripWeight=(double *)calloc(SoilStripNumber,sizeof(double));
    
    if((r*sin(AngleTime*radian))>=Average.Height){
        Distance=r*cos(AngleTime*radian)+DotX;   //Distance表示水平距离
        AngleTimetwo=acos(Distance/r)*Angle;
        DeltaAngleTimeOne=(AngleTime-AngleTimetwo)/SoilStripNumber;
    }
    
    //printf("  %.2lf",DotX);
    //竖条高和竖条自重
    for(i=0;i<SoilStripNumber;i++){
        AngleTimeOne=DeltaAngleTimeOne*(i+1);
        //printf("  %.2lf",SoilStripWide);
        if(AngleTimeOne<=AngleTime){
            ArcFy[i]=r*sin(AngleTime*radian)-r*cos(((90-AngleTime)+AngleTimeOne)*radian);
            ArcX[i]=r*sin(((90-AngleTime)+AngleTimeOne)*radian)-r*cos(AngleTime*radian);
            //printf("  %.2lf",ArcFy[i]);
        }
        //printf("  %.2lf",ArcX[i]);
        if(i==1){
            ArcSoilStripWeight[i]=Average.VolumWeight*ArcX[i]*ArcFy[i];
        }else{
            ArcSoilStripWeight[i]=Average.VolumWeight*(ArcX[i]-ArcX[i-1])*ArcFy[i];
        }
        //printf("  %.2lf",ArcSoilStripWeight[i]);
    }
    //printf("\n");
    for(i=0;i<SoilStripNumber;i++){
        
        if(ArcX[i]<=H_Distance){
            if(i==0){
                S_LineFy[i]=(Average.Height/H_Distance)*ArcX[i];
                S_LineSoilStripWeight[i]=Average.VolumWeight*ArcX[i]*S_LineFy[i];
            }
            else{
                S_LineFy[i]=(Average.Height/H_Distance)*ArcX[i];
                S_LineSoilStripWeight[i]=Average.VolumWeight*(ArcX[i]-ArcX[i-1])*S_LineFy[i];
            }
        }
        else{
            S_LineFy[i]=Average.Height;
            S_LineSoilStripWeight[i]=Average.VolumWeight*(ArcX[i]-ArcX[i-1])*Average.Height;
        }
    //printf("  %.2lf",S_LineSoilStripWeight[i]);
    }
    
    //计算直线与圆弧所对应的土条重量差值,弧长,角度
    for(i=0;i<SoilStripNumber;i++){
        if(i<(SoilStripNumber-1))
            NetSoilStripWeight[i]=S_LineSoilStripWeight[i]-ArcSoilStripWeight[i];
        else
            NetSoilStripWeight[i]=0.5*(S_LineSoilStripWeight[i-1]-ArcSoilStripWeight[i-1]);
    //printf("  %.2lf",NetSoilStripWeight[i]);
    }
    //printf("\n");   
    for(i=0;i<SoilStripNumber;i++){
        if(i==0){
            ArcLength[i]=sqrt(pow(ArcX[i],2)+pow(ArcFy[i],2));
            ArcAngle[i]=atan2(ArcFy[i],ArcX[i]);  //弧度制
        }
        else{
            ArcLength[i]=sqrt(pow(ArcX[i]-ArcX[i-1],2)+pow((ArcFy[i]-ArcFy[i-1]),2));
            ArcAngle[i]=atan2((ArcFy[i]-ArcFy[i-1]),(ArcX[i]-ArcX[i-1]));  //弧度制
        }
    //printf("  %.2lf",ArcAngle[i]);
    }
    
    GravityComponet(NetSoilStripWeight,ArcLength,ArcAngle,r,OneAngleTime);
    free(S_LineFy);
    free(ArcLength);
    free(ArcAngle);
    free(ArcX);
    free(ArcFy);
    free(ArcSoilStripWeight);
    free(S_LineSoilStripWeight);
    free(NetSoilStripWeight);
}

void GravityComponet(double *NetSoilStripWeight,double *ArcLength,double *ArcAngle,double r,double AngleTime)  //计算下滑力和抗滑力
{
    int i=0;
    double MR=0,MT=0,R=r,OneAngleTime=AngleTime;  //抗滑力矩MT和滑动力矩MR
    double *TangantGravity,*VerticalGravity;
    double *ShearStrength,*ShearForce;            //微段弧长上的剪应力和剪力
    
    TangantGravity=(double *)calloc(SoilStripNumber,sizeof(double));
    VerticalGravity=(double *)calloc(SoilStripNumber,sizeof(double));
    ShearStrength=(double *)calloc(SoilStripNumber,sizeof(double));
    ShearForce=(double *)calloc(SoilStripNumber,sizeof(double));
    //计算下滑力
    for(i=0;i<SoilStripNumber;i++){
        TangantGravity[i]=NetSoilStripWeight[i]*sin(ArcAngle[i]);
        VerticalGravity[i]=NetSoilStripWeight[i]*cos(ArcAngle[i]);     //垂直于滑动面的法向力
    }
    //计算抗剪强度
    for(i=0;i<SoilStripNumber;i++){
        ShearStrength[i]=(VerticalGravity[i]/ArcLength[i])*tan(Average.FrictionAngle*radian)+Average.Cohesive;
        ShearForce[i]=ShearStrength[i]*ArcLength[i];
    }
    //printf("\n");
    for(i=0;i<SoilStripNumber;i++){
        MT+=(TangantGravity[i]*r);
        MR+=(ShearForce[i]*r);
    }
    
    //printf("  %.2lf",MT);
    SafetyFactor(MR,MT,R,OneAngleTime);     //计算安全系数
    free(TangantGravity);
    free(VerticalGravity);
    free(ShearStrength);
    free(ShearForce);
}
void SafetyFactor(double MR,double MT,double R,double OneAngleTime)
{
    numberone++;
    double Ks_one=0;
    Ks_one=MR/MT;
    if(numberone==1){
        Result.Ks=Ks_one;
        Result.Rdius=R;
        Result.AngleTime=OneAngleTime;
        Result.Mr=MR;
        Result.Mt=MT;
    }   
    //下面代码将最小的Ks_one赋值给Ks
    if(numberone!=1){
        if(Result.Ks>=Ks_one){
            Result.Ks=Ks_one;
            Result.Rdius=R;
            Result.AngleTime=OneAngleTime;
            Result.Mr=MR;
            Result.Mt=MT;
        }
    }
}

瑞典条分法计算代码(恳请指正)相关推荐

  1. 毕肖普法matlab,瑞典条分法计算例题

    确定安全系数 Fs T R TR Wi cos itgi Wi sin i cili 条分法是一种试算法,应选取 不同圆心位置和不同半径进行 计算,求最小的安全系数 三.例题分析 [...... 瑞典 ...

  2. matlab语句运算相关论文,等于计算论文,关于MATLAB在瑞典条分法中的应用相关参考文献资料-免费论文范文...

    导读:该文是关于等于计算论文范文,为你的论文写作提供相关论文资料参考. (1.河海大学 港口航道与近海工程学院,江苏 南京 210098: 2..河海大学 土木与交通学院,江苏 南京 210098) ...

  3. 毕肖普法matlab,瑞典条分法和毕肖普法计算实例.docx

    作业1--边坡稳定性分析1. 题 目图示均质黏性土边坡,高25m,坡度1:2,土的重度=20kN/m3,内摩擦角=25o,黏聚力c=10kPa.试分别利用瑞典条分法和简化Bishop法计算滑动圆心位于 ...

  4. 圆弧滑动条分法matlab,圆弧滑动面的边坡稳定计算方法完整版.ppt

    第三节 曲线滑动面的边坡稳定性分析 圆弧滑动面的边坡稳定计算方法: (1)条分法(瑞典法) (2)表解和图解法 (3)应力圆法 (4)φ圆法 精选文档 * 1. 圆弧滑动面的条分法(条分法是具有代表性 ...

  5. Stata17 MP/SE/BE(附赠常用模型代码和熵值法计算代码)

    一.Stata MP\SE\BE版本介绍 Stata/MP:最快的 Stata 版本(适用于四核.双核和多核/多处理器计算机),可以分析最大的数据集 Stata/SE:标准版:对于更大的数据集 Sta ...

  6. python莱布尼茨法计算π_python圆周率计算(带进度条)

    3.波尔文四次迭代式 这个公式由乔纳森·波尔文和彼得·波尔文于1985年发表的. bailey-borwein-plouffe算法 这个公式简称BBP公式,由David Bailey, Peter B ...

  7. python woe分箱_python自动分箱,计算woe,iv的实例代码

    笔者之前用R开发评分卡时,需要进行分箱计算woe及iv值,采用的R包是smbinning,它可以自动进行分箱.近期换用python开发, 也想实现自动分箱功能,找到了一个woe包,地址https:// ...

  8. python计算长方形周长代码_python微元法计算函数曲线长度的方法

    计算曲线长度,根据线积分公式: ,令积分函数f(x,y,z) 为1,即计算曲线的长度,将其微元化: 其中 根据此时便可在python编程实现,给出4个例子,代码中已有详细注释,不再赘述 ''' 计算曲 ...

  9. 动力学矩阵法计算石墨烯声子谱

    上个学期,学习固体物理,老师让写一个程序来计算石墨烯的声子谱和振动的态密度进行画图.大二的假期里自学了Python但是没有实际自己写过,决定用Python代码来实现这个任务(最重要的是自己能力不行,c ...

最新文章

  1. RBAC用户角色权限设计方案
  2. 实战SSM_O2O商铺_20【商铺编辑】View层开发
  3. LeetCode 06Z字形变换07整数反转
  4. nginx修改监听端口号8080_Nginx + Tomcat 配置
  5. javaweb学习总结九(xml解析以及调整JVM内存大小)
  6. git回滚到某一个commit
  7. loadrunner之java协议脚本编写
  8. drupal 迁移_关于如何迁移到Drupal的4个技巧
  9. 笨办法学 Python · 续 练习 20:二叉搜索树
  10. sql查询时的左连接,右连接,和内连接详细解释
  11. 11月1日上午PHP批量删除
  12. 中国城市经纬度表(精确到县区)Google地图用
  13. 小米平板4刷recovery教程_小米4刷第三方recovery教程和方法
  14. sqlserver查询语句实例
  15. Linux fstab文件详解
  16. ssget 用法详解
  17. delphi7中的局部变量和全局变量
  18. HTML5高级之position(定位)
  19. 美团后台开发暑期实习面经(一面+二面)已offer
  20. 初学linux用哪个发行版本,初学者学习Linux选择哪个发行版本合适?

热门文章

  1. python量化交易入门学习 之用优矿的数据接口文档
  2. C语言实现可以重复玩的猜数字游戏
  3. 走进隆平水稻博物馆,再次感受袁老的伟大!
  4. java毕业设计在线问诊系统的设计与实现Mybatis+系统+数据库+调试部署
  5. 10安时、12安时和14安时是什么意思啊?
  6. 不良资产回收处置创新方式
  7. pwnable.kr asm
  8. 日常开发记录-el-table 固定列下横向滚动条无法拖动的问题解决方案
  9. Spring:@Nullable和@NonNull
  10. MatLab7安装方法