专栏首页javascript趣味编程5.2.4 二维无内热源稳态导热程序

5.2.4 二维无内热源稳态导热程序

理论可以查看前文视频,或者编程基础。2D显式温度场内部节点迭代格式如下:

算例如下图矩形,左侧和下侧边界上温度分别是某一函数分布;右侧和上侧温度为0.

假设网格取5×3,即共6×4=24个节点。温度场求解程序如下:

Array.create = function(dimension, initialValue){
    var arr = [];
    for(var i=0;i<dimension;i++){
        arr[i]=initialValue;
    }
    return arr;
};

var Solution=function(tmpr){
  this.tmpr=tmpr;

  this.SetUpGeometryAndMesh=SetUpGeometryAndMesh;
  this.SetUpBoundaryCondition=SetUpBoundaryCondition;
  this.Solve=Solve;
};

function SetUpGeometryAndMesh(dx,dy){
  for(var i=0;i<5+1;i++){
    tmpr[i]=Array.create(3+1,0);
  }
}

function SetUpBoundaryCondition(dx,dy){
  for(var j=0;j<3+1;j++){
    tmpr[0][j]=4*j*(3.0-j);//左侧
    tmpr[5][j]=0;//右侧
  }

  for(var i=0;i<5+1;i++){//
    tmpr[i][0]=10*Math.sin(Math.PI*i/5.0)
    tmpr[i][3]=0;//
  }
}

function Solve(){
  var err,iter=0,maxIter,tmp,N=5*3/*节点总数*/;
  do{
    err=0/*误差*/,maxIter=100/*最大迭代次数*/;
    for(var i=1;i<5;i++){
      for(var j=1;j<3;j++){
        tmp=0.25*(tmpr[i+1][j]+tmpr[i-1][j]+tmpr[i][j+1]+tmpr[i][j-1]);
        err+=(tmp-tmpr[i][j])*(tmp-tmpr[i][j]);
        tmpr[i][j]=tmp;
      }
    }
    iter++;//迭代次数
    err=Math.sqrt(err/N);
    errors.push(err);iters.push(iter)
  }while(err>1E-4)

  console.info('最终误差:',err);
}

var tmpr=[],iters=[],errors=[];

function getHeat2DProfile(){
  var solution=new Solution(tmpr);
  var dx=0.1; var dy=0.1;//本特例网格dx与dy必须一致
  solution.SetUpGeometryAndMesh(dx,dy);//网格
  solution.SetUpBoundaryCondition(dx,dy);//设置边界条件
  solution.Solve();//求解

  var results=[];
  for(var j=0;j<3+1;j++){
    for(var i=0;i<5+1;i++){
      var arr=[j,i,tmpr[i][j].toFixed(1)];
      results.push(arr);
    }
  }
  return results;
}

module.exports = {
  getHeat2DProfile: getHeat2DProfile
}

上述程序是小程序新工科课程设计HTML5小程序里自带程序24个节点的温度场,使用百度echarts.heatmap可视化,虽然丑了点,但信息很全面,运行效果如下:

加密网格到51×31个,有兴趣的读者可以自行将温度场可视化!此处给计算的关键代码,仅供参考:

Array.create = function(dimension, initialValue){
    var arr = [];
    for(var i=0;i<dimension;i++){
        arr[i]=initialValue;
    }
    return arr;
};

var Solution=function(tmpr){
  this.tmpr=tmpr;

  this.SetUpGeometryAndMesh=SetUpGeometryAndMesh;
  this.SetUpBoundaryCondition=SetUpBoundaryCondition;
  this.Solve=Solve;
  this.HeatfluxEval=HeatfluxEval;
  this.GetContourData=GetContourData;
  this.ShowResults=ShowResults;
};

function SetUpGeometryAndMesh(dx,dy){
  for(var i=0;i<50+1;i++){
    tmpr[i]=Array.create(30+1,0);
    Qx[i]=Array.create(30+1,0);
    Qy[i]=Array.create(30+1,0);
  }
}

function SetUpBoundaryCondition(dx,dy){
  for(var j=0;j<30+1;j++){
    tmpr[0][j]=0.05*j*(30.0-j);//左侧
    tmpr[50][j]=0;//右侧
  }

  for(var i=0;i<50+1;i++){//
    tmpr[i][0]=10*Math.sin(Math.PI*i/50.0)
    tmpr[i][30]=0;//
  }

  tabulateResults(tmpr);
}

function Solve(){
  var err,iter=0,tmp,N=51*31/*节点总数*/;
  do{
    err=0/*误差*/,maxIter=1000/*最大迭代次数*/;
    for(var i=1;i<50;i++){
      for(var j=1;j<30;j++){
        tmp=0.25*(tmpr[i+1][j]+tmpr[i-1][j]+tmpr[i][j+1]+tmpr[i][j-1]);
        err+=(tmp-tmpr[i][j])*(tmp-tmpr[i][j]);
        tmpr[i][j]=tmp;
      }
    }
    iter++;//迭代次数
    err=Math.sqrt(err/N);
    errors.push(err);iters.push(iter)
  }while(err>1E-4)
  tabulateResults(tmpr);
  console.info('最终误差:',err);
}

function ShowResults(){}

var tmpr=[],Qx=[],Qy=[],iters=[],errors=[];

function onSolve(){
  var solution=new Solution(tmpr);
  var dx=0.1;  var dy=0.1;//本特例网格dx与dy必须一致
  solution.SetUpGeometryAndMesh(dx,dy);//网格
  solution.SetUpBoundaryCondition(dx,dy);//设置边界条件
  solution.Solve();//求解
  solution.HeatfluxEval(dx,dy);//由流函数计算流体速度
  solution.ShowResults();//绘制流函数及速度云图
}

最终结果应当如下:

程序完整源代码及演示请猛戳这里: https://songxp03.github.io/SimFun/

本文分享自微信公众号 - 传输过程数值模拟学习笔记(SongSimStudio),作者:艾谁谁

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 9.2 时域分析与频域分析

    时域和频域分析师自动控制原理里非常重要的内容,也是《热工过程自动控制》里的基础内容。首先分析一个常见的RC网络电路:

    周星星9527
  • 8.2 时域分析与频域分析

    时域和频域分析师自动控制原理里非常重要的内容,也是《热工过程自动控制》里的基础内容。首先分析一个常见的RC网络电路:

    周星星9527
  • 5.1.2 一维非稳态无内热源导热程序

    一维非稳态无内热源导热程序理论部分前文已述,对应教学视频已述。1D显式内部节点迭代格式如下:

    周星星9527
  • 小程序日历控件js日历数据组装

    在h5开发中,很多地方都要用到日历控件,比如生日、出发到达日期等等,今天就来讲讲日历控件数据初始化。 用到了moment插件,moment api地址请点击。

    Javanx
  • PHP的变量范围

    什么是变量的作用域?变量的作用域是指在脚本的一次生命周期内变量的有效范围。一般来说有全局和局部之分。 PHP中变量的作用域可以分为:超全局(全局变量的特殊类型...

    luxixing
  • js设计模式补白之 this/call和apply

    这里call(this)显然是把当前的作用域(window)绑定给了getName方法。

    一粒小麦
  • (收藏)控制面板都卸载不掉的Microsoft Office,该怎么办?

    Microsoft Office 的安装可能会出现很多问题,其中有很大一部分就是因为之前的Office没有卸载干净,同时,卸载Office的时候可能会出现很多问...

    课代表
  • 9.2 时域分析与频域分析

    时域和频域分析师自动控制原理里非常重要的内容,也是《热工过程自动控制》里的基础内容。首先分析一个常见的RC网络电路:

    周星星9527
  • 8.2 时域分析与频域分析

    时域和频域分析师自动控制原理里非常重要的内容,也是《热工过程自动控制》里的基础内容。首先分析一个常见的RC网络电路:

    周星星9527
  • 显示DataGrid序号的一个适用的方法

    如果数据量小的话没有问题,一旦数据量大,显示特别慢,还有个缺点就是拖动行高时行号不随行高的变化而变动,出现是几个序号在一个单元格中显示。我自己对他们的算法进行总...

    Java架构师必看

扫码关注云+社区

领取腾讯云代金券