Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
timdream
0 / 0 / 0
Регистрация: 22.04.2013
Сообщений: 20
#1

Проверить код на ошибки - C++

17.06.2013, 21:50. Просмотров 385. Ответов 0
Метки нет (Все метки)

Всем привет! У меня есть программа, которая выполняет параллельное решения уравнения теплопроводности.

Вот код:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
//Параллельное  решение задачи
/* 
Настройка среды программирования:
*/
#include "stdafx.h"
#include "stdio.h"
#include <mpi.h>
#include "stdlib.h"
#include "math.h"
#include <sys\timeb.h>
 
/***************************************************************
#define i_max 400
#define j_max 600
*/
//*
#define i_max 40
#define j_max 60
//*/
#define Main_Process 0 
MPI_Status Process_Status, stat;
FILE* fout;
//***************************************************************
//описание всех переменных, используемых в программе
//int H_1, L_1, H_2, L_2, H_3, L_3 , H_4, L_4, H_5, L_5;
double H_1, L_1, H_2, L_2, H_3, L_3 , H_4, L_4, H_5, L_5;
int N_1z, N_1r, N_2z, N_2r, N_3z, N_3r, N_4z, N_4r, N_5z, N_5r;
int i, j, n, n_max, KT_ice;
int  ProcRank, ProcNum;
int N_r, N_z, h_z, h_r, Nn_z, i_j;
double  send[2],recv[2];
double h_1z, h_1r, h_2z, h_2r, h_3z, h_3r, h_4z, h_4r, h_5z, h_5r;
double lamda, ro, c, a;                    //грунт
double lamda_4, ro_4, c_4, a_4;    //сталь
double lamda_5, ro_5, c_5, a_5;    //вода
double a_tau, a_tau4, a_tau5;          //а*tau
double tau, t_end, time1;
double t_1, t_2, t_3, t_4, t_5, t_6, t_7;
double T_0, T_c, tau_Tc, T_ckp;
double T1_old[i_max][j_max], T1_new[i_max][j_max];
double T2_old[i_max][j_max], T2_new[i_max][j_max];
double T3_old[i_max][j_max], T3_new[i_max][j_max];
double T4_old[i_max][j_max], T4_new[i_max][j_max];
double T5_old[i_max][j_max], T5_new[i_max][j_max];
double T_old[i_max][j_max],  T_new[i_max][j_max];
double TN_new[i_max][j_max], TN_old[i_max][j_max];
int NN_r, NN_z;
//нахождение температур по z по формуле 8 на итерации
 void Itern1_8 (int N_r, int N_z,double h_z, double (*T_old)[i_max][j_max], double (*T_new)[i_max][j_max], double a_tau);
//нахождение температур по r по формуле 9 на итерации
 void Itern1_9 (int N_r,int N_z, double h_r, double (*T_old)[i_max][j_max], double (*T_new)[i_max][j_max], double a_tau);
//Определение температур для 1-5 в начальный момент
 void T_matr (double (*TN_new)[i_max][j_max], double (*TN_old)[i_max][j_max], int N_1r, int N_1z, double T_0);
//засечка по времени
double realtime(void);
//вывод температур матриц  в  результирующий файл
 void writefile (int N_r,int N_z, double h_z,double h_r,double (*T_new)[i_max][j_max]);
//***************************************************************
//Start
int main (int argc, char* argv[])
{
    t_1 = realtime(); //начало головной программы
    //Инициализация MPI и определение процессорной конфигурации
  MPI_Init(&argc, &argv);    
  MPI_Comm_size(MPI_COMM_WORLD,&ProcNum);
  MPI_Comm_rank(MPI_COMM_WORLD, &ProcRank);
    printf ("\n t_1=%f", t_1);
    printf ("\n ProcRank:%d", ProcRank);
    printf ("\n ProcNum:%d",ProcNum);
    t_2= MPI_Wtime();
//Вводим все необходимые величины для счета
lamda=1.13,   ro=1650,    c=2.09;              // для грунта с(Дж/кг*С),  ro(кг/м в 3), lamda(Вт/(м*С)) песок   
lamda_4=45.4, ro_4=7900,  c_4=0.462;             //для стали  
lamda_5=0.0010, ro_5=0.0010, c_5=1.0; //для воды
 
T_0=1.0, T_c=-10.0; T_ckp=-45, tau_Tc=-5;
 
 
H_1=1500, L_1=500,    N_1z=500, N_1r=300;
H_2=1200, L_2=400,    N_2z=400, N_2r=300;
H_3=900,  L_3=300,   N_3z=300, N_3r=300;
H_4=900,  L_4=300,   N_4z=300, N_4r=300;
H_5=600,  L_5=200,   N_5z=200, N_5r=200;
t_end=240; //240 часов=10 суток
//расчет шагов по сетке для 1-5
h_1z= H_1/N_1z, h_1r=L_1/N_1r;   //3мм, 1мм
h_2z=H_2/N_2z, h_2r=L_2/N_2r;   //3мм, 1мм
h_3z=H_3/N_3z, h_3r=L_3/N_3r;   //3мм, 1мм
h_4z=H_4/N_4z, h_4r=L_4/N_4r;   //3мм, 0.02мм
h_5z=H_5/N_5z, h_5r=L_5/N_5r;   //3мм, 0.4мм
 
KT_ice=0;     //количество температур воды <0 градусов;
//*
a=lamda/(ro*c);         //для 1-3
a_4=lamda_4/(ro_4*c_4); //для 4      .
a_5=lamda_5/(ro_5*c_5); //для 5
//*
a=0.492;                  //для 1-3
a_4=12.5;                 //для 4      .
a_5=0.398;                //для 5
//*/
n=0, time1=0; 
    
    tau=0.0005;       //30 минут
//Проверка схемы на устойчивость, выбор tau
if(tau>0.5*(h_4r*h_4r)/a_4)
    tau=0.5*(h_4r*h_4r)/a_4;
printf ("\n tau=%f", tau);
 
a_tau=a*tau; a_tau4=a_4*tau;   a_tau5=a_5*tau;
double T_c1=T_c;
int n_max=t_end/tau;     //количество итераций по времени
 
//Определение полей температур в начальный момент времени для 1-5
//для 1
T_matr (&T1_new, &T1_old, N_1r, N_1z, T_0);
for (i=0; i<=N_1r; i++)
{   T1_old[i][0]=T_c;
    T1_new[i][0]=T_c;
}
//для 2
T_matr (&T2_new, &T2_old, N_2r, N_2z, T_0);
//для 3
T_matr (&T3_new, &T3_old, N_3r, N_3z, T_0);
//для 4
T_matr (&T4_new, &T4_old, N_4r, N_4z, T_0);
//для 5
T_matr (&T5_new, &T5_old, N_5r, N_5z, T_0);
 
 MPI_Barrier (MPI_COMM_WORLD); 
  if(ProcRank!=0) 
{
//***************************************************************
//Основной итерационный цикл
do //начало цикла по T_c до T_cкр
 
{ do //начало цикла по n до n_max
//находим температуры для (n+1) шага
{ int K_fi ;
 if(ProcRank==1)    //для 1 по формуле 8
Itern1_8 (N_1r, N_1z, h_1z, &T1_old, &T1_new, a_tau);
 //переслыка температур с предпоследнего столбца текущей матрицы в 1-ый столбец следующей матрицы (для 1)
MPI_Send(T1_old[N_1r-1], N_1z , MPI_DOUBLE, 2,0, MPI_COMM_WORLD);
 
if(ProcRank==2)   // для 2 по формуле 9
Itern1_9 (N_2r, N_2z, h_2r, &T2_old, &T2_new, a_tau);
//переслыка температур с предпоследнего столбца текущей матрицы в 1-ый столбец следующей матрицы (для 1)
MPI_Send( T2_old[N_2r-1], N_2z, MPI_DOUBLE,3,0, MPI_COMM_WORLD);
MPI_Recv(T2_old[0], N_1z, MPI_DOUBLE, 1,0, MPI_COMM_WORLD, &stat);
K_fi =N_1z - N_2z;
for(j=0; j<N_2z; j++)
T2_old[0][j] =T2_old[0][j+K_fi];
 
if(ProcRank==3)    // для 3 по формуле 9
Itern1_9 (N_3r, N_3z, h_3r, &T3_old, &T3_new, a_tau);
MPI_Send(T3_old[N_3r-1], N_3z, MPI_DOUBLE, 4,0, MPI_COMM_WORLD);
MPI_Recv(T3_old[0], N_2z, MPI_DOUBLE,2,0, MPI_COMM_WORLD, &stat);
 K_fi =N_2z - N_3z;
for(j=0; j<N_3z; j++)
T3_old[0][j] =T3_old[0][j+K_fi];
 
 if(ProcRank==4)       //для 4 по формуле 9
Itern1_9 (N_4r, N_4z, h_4r, &T4_old, &T4_new, a_tau4); 
MPI_Send(T4_old[N_4r-1], N_4z, MPI_DOUBLE, 5,0, MPI_COMM_WORLD);
MPI_Recv(T4_old[0], N_3z, MPI_DOUBLE, 3,0, MPI_COMM_WORLD, &stat);
K_fi =N_3z - N_4z;
for(j=0; j<N_4z; j++)
T4_old[0][j] =T4_old[0][j+K_fi];
 
if(ProcRank==5)   //для 5 по формуле 9
Itern1_9 (N_5r, N_5z, h_5r, &T5_old, &T5_new, a_tau5);
MPI_Recv(T5_old[0], N_4z, MPI_DOUBLE,4,0, MPI_COMM_WORLD, &stat);
 K_fi =N_4z - N_5z;
for(j=0; j<N_5z; j++)
T5_old[0][j] =T5_old[0][j+K_fi];
 
n=n++, time1=time1+tau;
} //конец одной итерации по n
while (n< n_max); // конец цикла по n
 
printf ("\n Iteration count:%d", n);   // Печать количества итераций
//***************************************************************
// проверка температур воды. Если все температуры воды в 5 <0 градусов , то выход из  итерационного цикла по T_c1
if(ProcRank==5)
{for (i=1; i<N_5r; i++)
    {for (j=1; j<N_5z; j++)
        {if(T5_new[i][j]<0)
          KT_ice++;
        }
    }
int KT=(N_5r-1)*(N_5z-1);
printf ("\n KT_ice:%d", KT_ice);
if(KT==KT_ice)
break;     //выход из внешнего основного цикла по T_cкр
}
n=0, KT_ice=0, T_c1=T_c1+tau_Tc;
if(ProcRank==1)
for (i=0; i<=N_1r; i++)
    {T1_old[i][0]=T_c1;
      T1_new[i][0]=T_c1;
    }
  }  while (T_c1>T_ckp);
}
 
// Выход из итерационного цикла по T_cкр или по промерзанию воды в трубе (T_cкр= -40 // градусов)
printf ("\n ProcRank:%d", ProcRank);
    printf ("\n ProcNum:%d",ProcNum);
    t_2= MPI_Wtime();
 
 MPI_Barrier (MPI_COMM_WORLD);
 
printf ("\n KT_ice:%d", KT_ice );
t_6 = realtime();
 
printf ("\n Iteration count:%d", n);   // Печать количества итераций
 
printf ("\n time1=%f", time1);   // Печать времени
 
printf ("\n T_c1=%f", T_c1);   // Печать T_c1 - температура на поверхности грунта после счета
 
t_6=realtime();
printf ("\n t_6=%f", t_6);
t_7=t_6-t_1;
printf ("\n t_7=%f", t_7);   // Печать времени счета
 
t_5= MPI_Wtime();
 
MPI_Barrier (MPI_COMM_WORLD);
// Вывод матриц в результирующий файл
if(ProcRank==1) 
fout=fopen("M_T1_new", "w+");
writefile (N_1r, N_1z, h_1z, h_1r,&T1_new);
printf ("\n ProcRank:%d", ProcRank);
 
if(ProcRank==2) 
fout=fopen("M_T2_new", "w+");
writefile (N_2r, N_2z,h_2z, h_2r, &T2_new);
printf ("\n ProcRank:%d", ProcRank);
 
if(ProcRank==3) 
fout=fopen("M_T3_new", "w+");
writefile (N_3r, N_3z,h_3z, h_3r, &T3_new);
printf ("\n ProcRank:%d", ProcRank);
 
if(ProcRank==4) 
fout=fopen("M_T4_new", "w+");
writefile (N_4r, N_4z, h_4z, h_4r,  &T4_new);
printf ("\n ProcRank:%d", ProcRank);
 
if(ProcRank==5) 
fout=fopen("M_T5_new", "w+");
writefile (N_5r, N_5z, h_5z, h_5r,  &T5_new);
printf ("\n ProcRank:%d", ProcRank);
 
t_4= MPI_Wtime();
MPI_Finalize();
//system ("Pause");
return 0;  //Finish
}
 
//Подпрограмма нахождения температур на каждой итерации по формуле 8 по z, только //для 1
void Itern1_8(int N_r,int N_z, double h_z, double (*T_old)[i_max][j_max],double(*T_new)[i_max][j_max], double a_tau) 
 
{for (i=0; i<N_r; i++)
    for (j=1; j<N_z; j++)
 
    (*T_new)[i][j]=(*T_old)[i][j]+a_tau/(h_z*h_z)*((*T_old)[i][j+1]- 2*(*T_old)[i][j] +(*T_old)[i][j-1]);
 
//Пересылка температур из T_new в T_old
for (i=0; i<N_r; i++)
    for(j=0; j<N_z; j++)
            (*T_old)[i][j] =(*T_new)[i][j];
         
return; //выход в int main
}
//Подпрограмма нахождения температур на каждой итерации по формуле 9 по r для 4-5
void Itern1_9 (int N_r, int N_z,  double h_r, double (*T_old)[i_max][j_max],double(*T_new)[i_max][j_max], double a_tau)
{ 
    for(j=0; j<N_z; j++)
 {     for (i=1; i<N_r; i++)
       
 (*T_new)[i][j] = (*T_old)[i][j]+a_tau/(i*h_r*h_r)*
 (0.5*(2*i+1)*(*T_old)[i+1][j]-2*i*(*T_old)[i][j]+0.5*(2*i-1)*(*T_old)[i-1][j]);
}
for (i=0; i<N_r; i++)
    for(j=0; j<N_z; j++)
        (*T_old)[i][j] = (*T_new)[i][j];
 
return; //выход в int main
}
//подпрограмма определение температур для 1-5 в начальный момент
void T_matr (double (*TN_new)[i_max][j_max], double (*TN_old)[i_max][j_max], int NN_r, int NN_z, double T_0)
{for (i=0; i<=NN_r; i++)
    for(j=0; j<=NN_z; j++)
        {(*TN_old)[i][j]=T_0;
          (*TN_new)[i][j]=T_0;
         }
return ; //выход в int main
}
//подпрограмма засечки по времени 
double realtime ()
{
    struct _timeb tp;
_ftime64_s(&tp);
//_ftime(&tp);
return((double)(tp.time)*1000+(double)(tp.millitm));
}
//Подпрограмма вывода в результирующий файл
void writefile (int N_r, int N_z, double h_z,double h_r, double (*T_new)[i_max][j_max])
{
    for(j=0; j<N_z; j++)
    {
        for(i=0; i<N_r-1; i++)
        {
            fprintf(fout, "%11f", (*T_new)[i][j]);
    //  printf ("\n T1_new=%f",(*T_new)[i][j]);
        }
        fprintf(fout, "%11f\n", (*T_new)[i][N_r]);
    }
    fprintf(fout, "%d,  %d , %f, %f", N_r, N_z, h_r, h_z);
fclose (fout);
return; //выход в int main
}

После запуска выдается следующий результат (скриншот в прикрепленном файле)

В нем ProcRank идет не по порядку и почему-то не печатает количество итераций (хотя в коде я задавал на печать).

Помогите пожалуйста разобраться в чем проблема?
0
Миниатюры
Проверить код на ошибки  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2013, 21:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проверить код на ошибки (C++):

Структура ORDER. Проверить код на ошибки - C++
Может помочь с ошибкой и проверить правильно ли все работает)) Описать структуру с именем ORDE: Записи должны быть размещены в алфавитном...

Проверить заданный код C++ на ошибки (программа не желает компилироваться) - C++
Задание выглядит так: Напишите программу на тему Автовокзал (№ рейса, Фирма, Время прибытия, Время отправления, Место назначения, Вид...

проверить задачу на ошибки - C++
Даны вещественные массивы F, M.Для каждого массива определить произведение положительных элементов ,расположенных в чётных строках массива,...

Ошибки в коде (проверить) - C++
прога выдает ошибки: 1&gt;c:\users\ххх\documents\visual studio 2010\projects\lab4.1\lab4.1\lab4.1.cpp(112): warning C4552: *: оператор не...

проверить программу и исправить ошибки - C++
вывести номера отрицательных элементов #include&lt;iostream&gt; #include&lt;cmath&gt; using namespace std; int main() { int n; float a; ...

Можете проверить и указать на ошибки? - C++
Создать файл, состоящий из n целых чисел. Вывести на экран все отрицательные числа данного файла. #include &lt;iostream&gt; #include...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2013, 21:50
Привет! Вот еще темы с ответами:

проверить массив двумерный выдает ошибки.. - C++
#include &lt;iostream.h&gt; #include &lt;iomanip.h&gt; #include &lt;math.h&gt; int main() { double **a,tmp; int i,j,max,min,n,m; ...

Блок-схемы: проверить, указать ошибки - C++
Снизу два задания, для которых нужно нарисовать блок схемы, я нарисовал, просто хочу чтобы вы проверили и указали на ошибки, если они есть....

Помогите найти ошибки: проверить кратность чисел на 3 - C++
Написать программу которая просит пользователя ввести 10 чисел а после проверяет их кратность на 3 а затем печатает результат проверки...

Проверить синтаксические ошибки слов текста, хранящегося в файле программно - C++
Как написать программу, при помощи которой можно проверять синтаксические ошибки слов текста, хранящегося в файле.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.