gismo中用等几何解决线弹性问题的程序示例---未完待续2023.2.28

news2024/11/14 14:25:00

文章目录

  • 前言
  • 一、调用线弹性程序示例
    • 1.1 对plateWithHole.xml文件的理解
    • 1.2 程序及注释
    • 1.3 对边界力函数的理解
  • 总结 #pic_center


前言

gismo中用等几何解决线弹性问题

一、调用线弹性程序示例

1.1 对plateWithHole.xml文件的理解

算例来自文章:Isogeometric analysis: An overview and computer
implementation aspects

在这里插入图片描述
在这里插入图片描述

plateWithHole.xml文件

在这里插入图片描述

1.2 程序及注释

/// This is the 2D linear elasticity benchmark "Infinite plate with circular hole"
/// 这是二维线弹性基准“无限圆孔板”
/// as described in V.P.Nguyen, C.Anitescu, S.P.A.Bordas, T.Rabczuk, 2015
/// "Isogeometric analysis: An overview and computer implementation aspects".
/// 等几何分析:概述及计算机实现方面
/// Author: A.Shamanskiy (2016 - ...., TU Kaiserslautern)
#include <gismo.h>
#include <gsElasticity/gsElasticityAssembler.h>
#include <gsElasticity/gsWriteParaviewMultiPhysics.h>
#include<iostream>
using namespace std;

using namespace gismo;

int main(int argc, char* argv[]) {

    gsInfo << "This is the 2D linear elasticity benchmark: infinite plate with circular hole.\n";
    //gsInfo << " 这是二维线弹性问题:无限圆孔板 \n";

    //=====================================//
                // Input //
    //=====================================//

    std::string filename = "plateWithHole.xml";  // 打开    plateWithHole.xml文件
    index_t numUniRef = 1;     //  K细化次数 int型
    index_t numDegElev = 0;    //  升阶次数
    index_t numPlotPoints = 10000;    // preview软件画图的点数量
    bool plotMesh = false;  // preview画图时命令 136行:  是否画网格  false = 不画网格

    // 极简的终端用户界面
    gsCmdLine cmd("This is the 2D linear elasticity benchmark: infinite plate with circular hole.");
    //gsCmdLine cmd("这是二维线弹性问题:无限圆孔板");
    cmd.addInt("r", "refine", "Number of uniform refinement application", numUniRef);
    //cmd.addInt("r", "refine", " 细化次数    ", numUniRef);
    cmd.addInt("d", "degelev", "Number of degree elevation application:升阶次数?", numDegElev);
    // preview软件画图的点数量
    cmd.addInt("p", "points", "Number of points to plot to Paraview", numPlotPoints);
    cmd.addSwitch("m", "mesh", "Plot computational mesh:绘制计算网格", plotMesh);

    try { cmd.getValues(argc, argv); }   //  不太用看  不知道这个命令代表啥
    catch (int rv) { return rv; }   // 

    //=============================================//
        // Scanning geometry and creating bases:扫描几何和创建基函数 //
    //=============================================//

    // scanning geometry  扫描几何
    gsMultiPatch<> geometry;   //  定义一个多片
    gsReadFile<>(filename, geometry);    // 将plateWithHole.xml文件中的数据赋值给 geometry

    // 生成基函数
    gsMultiBasis<> basis(geometry);   // 生成基函数
    for (index_t i = 0; i < numDegElev; ++i)   // 升阶次数
        basis.degreeElevate();
    for (index_t i = 0; i < numUniRef; ++i)    // k细化(节点插入)次数
        basis.uniformRefine();
    
    //=============================================//
        // Setting loads and boundary conditions  设置载荷和边界条件 //
    //=============================================//
    // 应力的精确解
    gsFunctionExpr<> analyticalStresses("1-1/(x^2+y^2)*(3/2*cos(2*atan2(y,x)) + cos(4*atan2(y,x))) + 3/2/(x^2+y^2)^2*cos(4*atan2(y,x))",
        "-1/(x^2+y^2)*(1/2*cos(2*atan2(y,x)) - cos(4*atan2(y,x))) - 3/2/(x^2+y^2)^2*cos(4*atan2(y,x))",
        "-1/(x^2+y^2)*(1/2*sin(2*atan2(y,x)) + sin(4*atan2(y,x))) + 3/2/(x^2+y^2)^2*sin(4*atan2(y,x))", 2);
    // boundary load neumann BC 黎曼边界对应载荷边界条件  荷载BC   力的边界条件
    gsFunctionExpr<> traction("(-1+1/(x^2+y^2)*(3/2*cos(2*atan2(y,x)) + cos(4*atan2(y,x))) - 3/2/(x^2+y^2)^2*cos(4*atan2(y,x))) * (x==-4) +"
        "(-1/(x^2+y^2)*(1/2*sin(2*atan2(y,x)) + sin(4*atan2(y,x))) + 3/2/(x^2+y^2)^2*sin(4*atan2(y,x))) * (y==4)",
        "(1/(x^2+y^2)*(1/2*sin(2*atan2(y,x)) + sin(4*atan2(y,x))) - 3/2/(x^2+y^2)^2*sin(4*atan2(y,x))) * (x==-4) +"
        "(-1/(x^2+y^2)*(1/2*cos(2*atan2(y,x)) - cos(4*atan2(y,x))) - 3/2/(x^2+y^2)^2*cos(4*atan2(y,x))) * (y==4)", 2);
    // material parameters 材料参数
    real_t youngsModulus = 1.0e3;
    real_t poissonsRatio = 0.3;

    // boundary conditions 边界条件  黎曼边界对应载荷边界条件    dirichlete对应位移边界条件
    gsBoundaryConditions<> bcInfo;
    bcInfo.addCondition(0, boundary::north, condition_type::neumann, &traction);
    bcInfo.addCondition(0, boundary::west, condition_type::dirichlet, nullptr, 1); // last number is a component (coordinate) number
    bcInfo.addCondition(0, boundary::east, condition_type::dirichlet, nullptr, 0); // 最后一个数字是一个分量(坐标)的数字

    // source function, rhs  源函数,rhs
    gsConstantFunction<> g(0., 0., 2);   //  g = 0   0
    gsInfo << " g = \n " << g << "  \n ";

    //=============================================//
              // Assembling & solving  组装与解决 //
    //=============================================//

    // creating assembler  创建刚度矩阵
    gsElasticityAssembler<real_t> assembler(geometry, basis, bcInfo, g);
    assembler.options().setReal("YoungsModulus", youngsModulus);
    assembler.options().setReal("PoissonsRatio", poissonsRatio);
    gsInfo << "Assembling...\n";
    gsStopwatch clock;   //  计时
    clock.restart();    // 计时开始
    assembler.assemble();    //
   
    gsInfo << "Assembled a system (matrix and load vector) with "
        << assembler.numDofs() << " dofs in " << clock.stop() << "s.\n";
    //  在clock.stop中装配assembler.numDofs自由度的系统(矩阵和负载矢量)
    gsInfo << "Solving...\n";
    clock.restart();  //  计时结束

#ifdef GISMO_WITH_PARDISO    //  
    gsSparseSolver<>::PardisoLLT solver(assembler.matrix());   // 将刚度矩阵传入solver中
    gsVector<> solVector = solver.solve(assembler.rhs());    // 将刚度矩阵传入solver中
    gsInfo << "Solved the system with PardisoLDLT solver in " << clock.stop() << "s.\n";
    //用PardisoLDLT求解器解决了系统中的问题
#else
    gsSparseSolver<>::SimplicialLDLT solver(assembler.matrix());   //  assembler.matrix()传入solver
    gsVector<> solVector = solver.solve(assembler.rhs());   //  KU = p 的p传入solver
    gsInfo << "Solved the system with EigenLDLT solver in 在1中用EigenLDLT求解器求解系统 " << clock.stop() << "s.\n";
#endif

    //=============================================//
                      // Output //
    //=============================================//

    // 将位移构造为IGA函数
    gsMultiPatch<> solution;
    assembler.constructSolution(solVector, assembler.allFixedDofs(), solution);
    // 构造应力张量
    gsPiecewiseFunction<> stresses;
    assembler.constructCauchyStresses(solution, stresses, stress_components::all_2D_vector);

    if (numPlotPoints > 0)
    {
        // 构造位移的IGA场(几何+解)
        gsField<> solutionField(assembler.patches(), solution);
        //  构造应力的IGA场(几何+解)
        gsField<> stressField(assembler.patches(), stresses, true);
        //  分析应力
        gsField<> analyticalStressField(assembler.patches(), analyticalStresses, false);
        // 创建一个容器,将所有字段绘制到一个Paraview文件中
        // 生成的Paraview文件:  文件名是什么   文件保存在哪
        std::map<std::string, const gsField<>*> fields;
        fields["Deformation"] = &solutionField;
        fields["Stress"] = &stressField;
        fields["StressAnalytical"] = &analyticalStressField;
        gsWriteParaviewMultiPhysics(fields, "plateWithHole", numPlotPoints, plotMesh);
        //gsInfo << "Open \"plateWithHole.pvd\" in Paraview for visualization. Stress wiggles on the left side are caused by "
          //  "a singularity in the parametrization.\n";
    }
    cout << "  \n ";
    gsInfo << "assembler.fixedDofs() = \n" << assembler.fixedDofs();
    cout << "  \n ";
    cout << "assembler.matrix() = \n" << assembler.matrix();
    cout << "  \n ";
    cout << "assembler.matrix().rows() = \n" << assembler.matrix().rows();
    cout << "  \n ";
    cout << "assembler.matrix().cols() = \n" << assembler.matrix().cols();
    cout << "  \n ";
    //gsInfo << "assembler.matrix() = \n" << assembler.matrix();

    return 0;
}

1.3 对边界力函数的理解

在这里插入图片描述
在这里插入图片描述

下边界应该是u = 0

在这里插入图片描述

总结 #pic_center

空格         空格

二维数
1
1
1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/377829.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

操作系统真相还原_第7章:中断

文章目录7.1 中断分类外部中断内部中断7.2 中断描述符表中断门描述符中断描述符表寄存器IDTR中断处理过程中断发生时的栈变化7.3 可编程中断控制器8259A级联8259A8259A的编程7.4 编写中断处理程序中断初始化过程中断执行过程简单的中断处理程序中断处理程序改进思考7.5 8253定时…

PXC高可用集群(MySQL)

1. PXC集群概述 1.1. PXC介绍 Percona XtraDB Cluster&#xff08;简称PXC&#xff09; 是基于Galera的MySQL高可用集群解决方案Galera Cluster是Codership公司开发的一套免费开源的高可用方案PXC集群主要由两部分组成&#xff1a;Percona Server with XtraDB&#xff08;数据…

XXL-JOB

XXL-JOB介绍 XXL-JOB是一个轻量级分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。 官网&#xff1a;https://www.xuxueli.com/xxl-job/ 文档&#xff1a;分布式任务调度…

GO中sync 包的 RWMutex 读写互斥锁

文章目录背景RWMutex 简介代码验证多个协程请求读锁 RLock() 和 RLock()读写交错 RLock() 和 Lock()写入的时候读取读取的时候写入请求多个写Lock() 和 Lock()背景 Mutex 互斥锁是严格锁定读和写&#xff0c;如果我们需要单独对读或者写添加锁需要使用 sync包的RWMutex 针对读…

Linux服务器快速安装MySQL数据库

Linux服务器快速安装MySQL数据库 mysql官网下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 推荐使用命令下载安装&#xff0c;比较快 开始安装mysql 1.通过wget下载安装包 wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.no…

运动耳机怎样戴不容易掉,运动不容易掉的运动蓝牙耳机推荐

在运动当中总是避免不了大幅度的晃动、跳跃&#xff0c;但是普通的耳机在运动当中佩戴时&#xff0c;耳机会时常出现掉落或者佩戴不牢固的现象发生&#xff0c;下面就给大家分享几款在运动当中佩戴较为稳固的运动蓝牙耳机吧~1、南卡Runner Pro4骨传导蓝牙运动耳机 &#xffe5;…

卡尔曼滤波学习

原教程地址&#xff1a;KalmanFilter.NET 卡尔曼滤波广泛应用在雷达系统&#xff08;目标跟踪&#xff09;中&#xff0c;但是其实它还可以应用在任何需要估算和预测的领域。 一、一维卡尔曼滤波 通过8个数值例子介绍卡尔曼滤波&#xff0c;涉及平均数、方差、标准差等&#…

解决Spring Data Jpa 实体类自动创建数据库表失败问题

先说一下我遇到的这个问题&#xff0c;首先我是通过maven创建了一个spring boot的工程&#xff0c;引入了Spring data jpa&#xff0c;结果实体类创建好之后&#xff0c;运行工程却没有在数据库中自动创建数据表。 找了半天发现是一个配置的问题! hibernate.ddl-auto节点的配…

【python学习笔记】:条件语句

Python 条件语句 Python条件语句是通过一条或多条语句的执行结果&#xff08;True或者False&#xff09;来决定执行的代码块。 可以通过下图来简单了解条件语句的执行过程: Python程序语言指定任何非0和非空&#xff08;null&#xff09;值为true&#xff0c;0 或者 null为fa…

Vue 中过滤器 filter 使用教程

Vue 过滤器 filter 使用教程文章目录Vue 过滤器 filter 使用教程一、过滤器1.1 过滤器使用的背景1.2 格式化时间的不同实现1.3 过滤器的使用1.4 过滤器总结一、过滤器 1.1 过滤器使用的背景 过滤器提供给我们的一种数据处理方式。过滤器功能不是必须要使用的&#xff0c;因为它…

DSP_TMS320F28377D_ADC学习笔记

前言 DSP各种模块的使用&#xff0c;基本上就是 GPIO复用配置、相关控制寄存器的配置、中断的配置。本文主要记录本人对ADC模块的学习笔记。TMS320F28377D上面有24路ADC专用IO&#xff0c;这意味着不需要进行GPIO复用配置。 只需要考虑相关控制寄存器和中断的配置。看代码请直…

2023年湖北住建厅八大员各岗位题库精准小题库-启程别

2023年湖北住建厅八大员各岗位题库精准小题库-启程别 住建厅八大员&#xff08;施工员、质量员、资料员、材料员、机械员、标准员、劳务员&#xff09; 各岗位题库分2种&#xff1a; 1.住建厅八大员报名之后会有培训任务&#xff0c;完成培训任务学习才能安排考试&#xff0c;…

番外10:使用ADS对射频功率放大器进行非线性测试2(使用带宽20MHz的64QAM信号进行ACLR、EVM、CCDF测试)

番外10&#xff1a;使用ADS对射频功率放大器进行非线性测试2&#xff08;使用带宽20MHz的64QAM信号进行ACLR、EVM、CCDF测试&#xff09; 1、基本理论 功率放大器的非线性性能十分重要&#xff0c;特别是对于当前广泛使用的移动设备。由于其各种复杂的信号调制&#xff0c;功…

大数据系统重点

第一章 大数据计算系统概述 1 大数据计算框架概述 计算框架: 一种抽象&#xff0c;在其中提供相应的通用功能供用户编写代码以实现具体功能&#xff0c;从而形成面向应用的软件。 大数据计算框架&#xff1a;面向大数据的计算框架。 Hadoop Hadoop的运行过程 Hadoop的详细…

Android 9.0系统源码_通知服务(三)应用发送状态栏通知的流程

前言 应用发送一个显示在状态栏上的通知&#xff0c;对于移动设备来说是很常见的一种功能需求&#xff0c;本篇文章我们将会结合Android9.0系统源码具体来分析一下&#xff0c;应用调用notificationManager触发通知栏通知功能的源码流程。 一、应用触发状态栏通知 应用可以通…

专题:一看就会的C++类模板讲解 (1)

目录 一.类模板的作用 二.类模板的定义&#xff1a; 三.类模板的声明格式&#xff1a; 四.类模板对象 五.再举一个例子 一.类模板的作用 面向对象的程序设计编程实践中&#xff0c;我们可能会面临这样的问题&#xff1a;要实现比较两个数的大小。明明比较两个数的方法都一样…

小米mix2s刷win11和android双系统

在给电脑安装系统的过程中&#xff0c;可能会因为各种原因出现windows无法安装的情况&#xff0c;我在给小米mix2s安装win11时发现出现了“计算机意外地重新启动或遇到错误&#xff0c;windows无法安装”的情况&#xff0c;下面就来教一下大家两种解决方法&#xff0c;希望可以…

进行新类检测以及概念漂移适应的半监督分类框架SACCOS论文阅读笔记

介绍 本文主要想解决基于聚类的概念漂移检测方法中常做出的强假设问题&#xff0c;即假设同类比较接近&#xff0c;异类比较远离&#xff0c;并且还假设新类别出现时通常会连续大量出现。 针对这些问题&#xff0c;本文提出了一种基于数据流的半监督自适应分类框架SACCOS&…

程序员看过都说好的资源网站,看看你都用过哪些?

程序员必备的相关资源网站一.图片专区1.表情包&#xff08;1&#xff09;发表情&#xff08;2&#xff09;逗比拯救世界&#xff08;3&#xff09;搞怪图片生成&#xff08;4&#xff09;哇咔工具2.图标库&#xff08;1&#xff09;Font Awesome&#xff08;2&#xff09;iconf…

基于vscode开发vue项目的详细步骤教程 2 第三方图标库FontAwesome

1、Vue下载安装步骤的详细教程(亲测有效) 1_水w的博客-CSDN博客 2、Vue下载安装步骤的详细教程(亲测有效) 2 安装与创建默认项目_水w的博客-CSDN博客 3、基于vscode开发vue项目的详细步骤教程_水w的博客-CSDN博客 目录 六、第三方图标库FontAwesome 1 安装FontAwesome 解决报…