Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
7
Добавлен:
14.03.2016
Размер:
4.67 Кб
Скачать
//Содержание файла «fem2.h»
/*
#include <ctype.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>

 int bars_N, knots_N, DSign;
 double *force, *strengs, *length, *f, *solution;
 double *up, *down, *diag;
 double  K_M[100][100],L[100][100], U[100][100];
 double VV[100];
 int Indx[100];
 
 int inputdata(void);
 int output(void);
 void K_matrix(void);
 void progon(int ,double *,double *,double *,double *);
*/


//Содержание файла «fem2.cpp»

#include "fem2.h"

int main(int argc,char *argv[]) {
  if(inputdata() == 0 ) return 0;
  solution = new double[knots_N];
  K_matrix(); //построение матрицы жёсткости системы К (формула (15))
  progon(knots_N, down, diag, up, f);  // решение матричного уравнения методом прогонки
  output();
 return 1;
}

//Вычисление матричных элементов по формуле (15)
void K_matrix(void) {
 for (int i=0;i<knots_N;i++) {
  for (int j=0;j<knots_N;j++) {
   if (i==j) {
       K[i][i] = strengs[i]+strengs[i+1];   
     }
   else if ((i-j)==1 ){
     K[i][j] = -strengs[i];
    }
   else if ((i-j)==-1){
     K[i][j] = -strengs[j];
    }
   else {
     K[i][j] = 0;
   }
  }
 }
down = new double[knots_N]; 
diag = new double[knots_N]; 
up = new double[knots_N]; 

 for (int i=0; i < knots_N; i++) {
  for (int j=0; j < knots_N;j++) {
    if (i==j)  { diag[i] = K[i][i]; }
    if ((i-j)==1)     { down[i] = K[i][j];  }
    if ((i-j)==-1)     { up[i] = K[i][j];  } 
  }
 }
}
// считывание исходных данных из файла
int inputdata(void) {
  FILE *in;
  if ((in = fopen("multybar.dat", "rt")) == NULL)  {
    fprintf(stderr, "? multybar.dat file ? \n");
    return 0;
  }
  fscanf(in,"%d\n",&bars_N); // число элементов
  knots_N = bars_N-1;       // число узлов
  double *c;
  force = new double[knots_N];// силы в узлах
  f = new double[knots_N];    
  strengs = new double[bars_N];// жесткость элемента на единицу длины
  length = new double[bars_N];// длина элемента стержня
  c = new double[bars_N];//жесткость элемента стержня
  for(int i = 0;i < knots_N ; i++) {
    fscanf(in,"%lg\n",&force[i]); 
    f[i] = force[i];
  }
  for(int i= 0;i < bars_N; i++) {
    fscanf(in,"%lg %lg\n",&length[i],&c[i]);  
    //жесткость элемента на единицу длины
  strengs[i] = c[i]/length[i];
  }
  fclose(in);
  return 1;
 }
 
//вывод результата
int output(void) {
  FILE *out;
  out = fopen("results.dat", "wt");
  double x;
  fprintf(out,"\n x, m       force, N     u, m\n");
  for (int i=0;i<knots_N;i++) {
    x = x + length[i];
    fprintf(out,"%-12.3g%-12.3g%-12.3g\n", x, force[i], solution[i]);
    }
  fclose(out);
return 1;
}

void progon(int n,double c[],double a[],double b[],double g[])
//  Решение линейной трёхдиагональной матрицы методом прогонки
//   int n - порядок марицы
//   double c[] - входной вектор длины n - диагональные матричные элементы под главной диагональю
//               c[0] не используется
//   double a[] - входной вектор длины n - диагональные матричные элементы в главной диагонали
//               разрушается в процессе вычислений
//   double b[] - входной вектор длины n - диагональные матричные элементы над главной диагональю,
//                b[n-1] не используется
//   double g[ - входной вектор длины n - правая часть матричного уравнения,
//               при вычислении разрушается и заменяется решением
{
  int j,i;
  double r;
  for(i=1;i<n;i++) {
    j=i-1;
    r=c[i]/a[j];
    a[i]-=r*b[j];
    g[i]-=r*g[j];
  }
  j=n-1;
  g[j]/=a[j];
  for(i=n-2 ; i>=0; i--){
    g[i]=(g[i]-b[i]*g[i+1])/a[i];
  }
  solution = g;
}
/*
// файл входных данных "mutybar.dat"
6
10 
20
30 
40
50 
0.1 1e4
0.2 2e4
0.3 3e4
0.4 4e4
0.5 5e4
0.6 6e4

// Файл результатов вычислений

 x, m       force, N     u, m
0.1         10          0.000583    
0.3         20          0.00107     
0.6         30          0.00135     
1           40          0.00133     
1.5         50          0.000917    
*/
Соседние файлы в папке Приложение к разделу 2 Составной стержень
  • #
    14.03.20164.67 Кб7fem2.cpp
  • #
    14.03.20164.53 Кб7fem2.cpp~
  • #
    14.03.2016403 б7fem2.h
  • #
    14.03.2016405 б7fem2.h~
  • #
    14.03.201633.49 Кб11fem2.pdf
  • #
    14.03.2016153 б7GCC-comands