2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 помогите. Задача теплопроводности.
Сообщение20.06.2011, 11:45 
Решается задача теплопроводности для треугольной пластины: (0;0) (8;0) (4;4). На косых границах температура задана 100, на горизонтальной 50.
Результаты выводятся в файл, предназначенный для просмотра в MeshViewer.

Нужно сделать в точке на косой границе(например в точке (6;2) ) граничное условие третьего рода. Как это реализовать?)
Код:
// Implicit_Sheme_XYT.cpp: определяет точку входа для консольного приложения.
//

#include <math.h>
#include <fstream>
#include <iostream>
using namespace std;

double xc=4,xmax=8,ymax=4;
int K;   
int M;
double t1=50;    
double t2=100;
double t0=0;     



int k1(int m)
{
   return m;
}
int k2(int m)
{
   return K-m;
}
int m2(int k)
{
   return (k<=K/2?k:M-k+K/2);
}
int main()
{

   int k,n,m;
   double A=0.1;    // du/dt=A*(d2u/dx2+d2u/dy2)   A = lambda/c*ro
   double u1=50;    
   double u2=97.72;
   double U0=0;     

   double h=0.1;               
   K=(int)(xmax/h);     //Количество откезков по x   
   M=(int)(ymax/h);      //Количество откезков по y
   
   double tau=0.1;   
   int N=(int)(250/tau);   //Количество откезков по t
   
   double R=tau*A/(h*h)/2;         
   double ***u = new double**[N+1];
   for(n=0;n<=N;n++)
   {      
      u[n] = new double*[K+1];
      for(k=0;k<=K;k++)
         u[n][k] = new double[m2(k)+1];
   }

   for (k=0;k<=K;k++)
   {
      u[0][k][0]=u1;
      u[0][k][m2(k)]=u2;
   }

/*for (k=0;k<=K;k++)
{
if (m2(k)==60)
{
u[0][k][m2(k)]=100*sqrt(2*h*h)+u[0][k-1][m2(k)-1];
}
else
{
u[0][k][m2(k)]=u2;
}
}*/

   for (k=1;k<=K-1;k++)
      for (m=1;m<=m2(k)-1;m++)
         u[0][k][m]=U0;
   
   double **u_ = new double*[K+1];
   for(k=0;k<=K;k++)
      u_[k] = new double[m2(k)+1];



   
   //метод прогонки
   double *L1 = new double[K+1];
   double **M1 = new double*[K+1];
   for(k=0;k<=K;k++)
      M1[k] = new double[m2(k)+1];
   double *L2 = new double[M+1];
   double **M2 = new double*[K+1];
   for(k=0;k<=K;k++)
      M2[k] = new double[m2(k)+1];

   L1[0]=0;
   for (k=0;k<=K/2;k++)
      M1[k][m2(k)]=u2;
   for (k=0;k<=K-1;k++)
      L1[k+1]=R/(-R*L1[k]+1+2*R);

   L2[0]=0;
   for (k=0;k<=K;k++)
      M2[k][0]=u1;
   for (m=0;m<=M-1;m++)
      L2[m+1]=R/(-R*L2[m]+1+2*R);

   for (n=0;n<=N-1;n++)
   {
      //Прямая
      for (k=0;k<=K-1;k++)
         for (m=0;m<=m2(k);m++)
            M1[k+1][m]=(u[n][k][m]+R*M1[k][m])/(-R*L1[k]+1+2*R);
      //Обратная
      for (k=K/2;k<=K;k++)
         u_[k][m2(k)]=u2;

      for (k=K-1;k>=0;k--)
         for (m=0;m<=m2(k)-1;m++)
            u_[k][m]=L1[k+1]*u_[k+1][m]+M1[k+1][m];

      
      for (k=0;k<=K;k++)
         for (m=0;m<=m2(k)-1;m++)         
            M2[k][m+1]=(u_[k][m]+R*M2[k][m])/(-R*L2[m]+1+2*R);
      //О
      for (k=0;k<=K;k++)
         u[n+1][k][m2(k)]=u2;
      for (k=0;k<=K;k++)
         for (m=m2(k)-1;m>=0;m--)
         u[n+1][k][m]=L2[m+1]*u[n+1][k][m+1]+M2[k][m+1];
   }

/*
if (m2(k)=60)
{
u[0][k][m2(k)]=100*sqrt(2*h*h)+u[0][k-1][m2(k)-1];
}
else
{
u[0][k][m2(k)]=u2;
}


if (m2(k)=60)
{
M1[k][m2(k)]=100*sqrt(2*h*h)+M1[k-1][m2(k)-1];
}
else
{
M1[k][m2(k)]=u2;
}


*/

   std::ofstream fout("triangle.mv");

   fout<<(K+1)*(M+1)<<" 3 7 U(0) U(1) U(10) U(25) U(250) \n";
   for (k=0;k<=K;k++)
   {
      for (m=0;m<=M;m++)
         if( m < m2(k))
            fout <<k*(M+1)+m+1<<" "<<h*k<<" "<<h*m<<" 0 "<<u[0][k][m]<<' '<<u[1][k][m]<<' '<<u[N/250][k][m]<<' '<<u[N/10][k][m]<<' '<<u[N][k][m]<<' '<<h*k<<' '<<h*m<<"\n";
         else fout <<k*(M+1)+m+1<<" "<<h*k<<" "<<h*m<<" 0 "<<u2+2.28<<' '<<u2+2.28<<' '<<u2+2.28<<' '<<u2+2.28<<' '<<u2+2.28<<" "<<h*k<<" "<<h*m<<"\n";

   }
   int node=0;

   for (k=0;k<=K-1;k++)
      for (m=0;m<=M-1;m++)
         if(k>=k1(m)&&k<=k2(m)-1)      node++;

   fout <<node<<" 4 0\n";
   int node1=0;
   for (k=0;k<=K-1;k++)
      for (m=0;m<=M-1;m++)
         if(k>=k1(m)&&k<=k2(m)-1)
            if((m==m2(k)-1)&&(k==k2(m)-1))
               fout <<(++node1)<<" "<<k*(M+1)+m+1 <<" "<<(k+1)*(M+1)+m+1<<" "<<k*(M+1)+(m+1)+1<<" "<<k*(M+1)+(m+1)+1<<"\n";
            else if((m==m2(k))&&(k==k1(m)))
               fout <<(++node1)<<" "<<k*(M+1)+m+1<<" "<<(k+1)*(M+1)+m+1<<" "<<(k+1)*(M+1)+(m+1)+1<<" "<<(k+1)*(M+1)+(m+1)+1<<"\n";
            else fout <<(++node1)<<" "<<k*(M+1)+m+1 <<" "<<(k+1)*(M+1)+m+1<<" "<<(k+1)*(M+1)+(m+1)+1<<" "<<k*(M+1)+(m+1)+1<<"\n";

   for(n=0;n<N+1;n++)
   {
      for(k=0;k<K+1;k++)
         delete[]u[n][k];
      delete[]u[n];
   }
   delete[]u;

   for(k=0;k<K+1;k++)
      delete[]u_[k];
   delete[]u_;

   delete[]L1;
   delete[]L2;

   for(k=0;k<K+1;k++)
      delete[]M2[k];
   delete[]M2;

   return 0;
}

 
 
 
 Re: помогите. Задача теплопроводности.
Сообщение24.06.2011, 15:06 
Код:
K=(int)(xmax/h);     //Количество откезков по x   
M=(int)(ymax/h);      //Количество откезков по y

Ваша программа валится, при работе без отладчика. Попробуйте исправить в этом месте, или где захотите.
hyper в сообщении #460130 писал(а):
Нужно сделать в точке на косой границе(например в точке (6;2) ) граничное условие третьего рода. Как это реализовать?)


Напишите формулы этих граничных условий и скажите что Вам мешает. С уважением,

 
 
 
 Re: помогите. Задача теплопроводности.
Сообщение30.06.2011, 23:08 
Небольшой вам совет, с вашего позволения:
Называйте функции и переменные более осмысленными именами, такие имена как м2, к5, и т.д. в итоге просто взрывают мозг :-)
Законченные по смыслу блоки выделяйте в функции или классы.
И программа станет намного понятнее и ошибок будет гораздо меньше.

Удачного кодирования :-)

 
 
 [ Сообщений: 3 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group