Flow123d
che_semchem.cc
Go to the documentation of this file.
1 //#define MAIN
2 #include <string.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <math.h>
6 #include "semchem/che_semchem.h"
7 //#include "system/system.hh"
8 #define _R 0.008314
9 #define VERZE "30-09-2005"
10 #define vystupni_soubor "che_out.txt"
11 #define PUL_POCTU_VNORENI 8
12 #define MAX_POC_VNEJ_CYK 1500
13 #define MAX_STAGNACE 400
14 #define MAX_POC_VNITR_CYK 2000
15 #define DROBNY_POSUN 1.0e-10
16 
17 //---------------------------------------------------------------------------
18 // GLOBAL VARIABLES
19 //---------------------------------------------------------------------------
20 extern struct TS_prm G_prm;
21 extern struct TS_lat *P_lat;
22 extern struct TS_che *P_che;
23 
24 
25 void che_vypis_soubor(char *soubor)
26 {
27  int i = 0;
28  FILE *fw;
29 
30  fw = fopen(soubor, "a");
31  for (i=0; i<G_prm.pocet_latekvefazi; i++)
32  fprintf (fw, "\nmolalita rozpustene %d. latky: %f", i, P_lat[i].m);
33  for (i=0; i<G_prm.pocet_latekvefazi; i++)
34  fclose(fw);
35 }
36 
37 void che_vypis__soubor(char *soubor)
38 {
39  int i = 0;
40  FILE *fw;
41 
42  fw = fopen(soubor, "a");
43  for (i=0; i<G_prm.pocet_latekvefazi; i++)
44  fprintf (fw,"\t%f", P_lat[i].m);
45  for (i=0; i<G_prm.pocet_latekvefazi; i++)
46  fprintf(fw,"\t%f",G_prm.objem);
47  fclose(fw);
48 }
49 
50 void che_outpocp_soubor(FILE *fw)
51 {
52  int i = 0;
53 
54  fprintf(fw,"\n..............................................................");
55  for (i=0; i<G_prm.pocet_latekvefazi; i++)
56  fprintf (fw, "\npocatecni molalita rozpustene %d. latky: %f", i, P_lat[i].m0);
57 }
58 
59 void che_outpocp__soubor(FILE *fw)
60 {
61  int i = 0;
62 
63  for (i=0; i<G_prm.pocet_latekvefazi; i++)
64  fprintf (fw,"\t%f", P_lat[i].m0);
65  for (i=0; i<G_prm.pocet_latekvefazi; i++)
66  fprintf(fw,"\t%f",G_prm.objem);
67 }
68 
69 int che_Gauss ( double *matice, double *prstrana, int *hprvky, int rozmer )
70 {
71  int i = 0;
72  int j = 0;
73  int k = 0;
74  int prvek = 0;
75  double velprvku = 0.0;
76 
77  if (G_prm.vypisy>4) printf("\nChe_Gauss");
78  if (rozmer <1)
79  return -1;
80  if (rozmer ==1)
81  {
82  hprvky[0]=0;
83  if (matice[0] == 0.0)
84  {
85  printf("prusvih Newtona: nulova derivace, prava strana = %f !\n", prstrana[0]);
86  if ( prstrana[0] == 0.0)
87  {
88  prstrana[0] = 1.0e-10; // cislo vycucane z prstu
89  return 0;
90  }
91  else
92  {
93  prstrana[0]*= 1.0e2; // cislo vycucane z prstu
94  return 0;
95  }
96  }
97  else
98  {
99  prstrana[0]/=matice[0];
100  }
101  return 0;
102  }
103 
104  for ( i=0; i<rozmer; ++i )
105  {
106 // Vyber hlavniho prvku
107  velprvku = 0.0;
108  prvek = -1;
109  k=0; // kvuli vyberu hlavniho prvku
110  for ( j=0; j<rozmer; ++j )
111  {
112  if (i>0)
113  {
114  for ( k=0; k<i; ++k )
115  {
116  if (hprvky[k]==j) break;
117  }
118  }
119  if ((k==i) && (fabs(matice[j*rozmer+i])>fabs(velprvku)))
120  {
121  prvek = j;
122  velprvku = matice[j*rozmer+i];
123  }
124  }
125 // hlavni prvek vybran v prvek
126  if (prvek == -1)
127  {
128  printf("Prusvih v %d. sloupci\n", i);
129  for ( j=0; j<rozmer; ++j )
130  {
131  if (i>0)
132  {
133  for ( k=0; k<i; ++k )
134  {
135  if (hprvky[k]==j) break;
136  }
137  }
138  if (k==i)
139  {
140  matice[j*rozmer+i]=1.0e-9; // cislo vycucane z prstu
141  prvek = j;
142  velprvku = matice[j*rozmer+i];
143  break;
144  }
145  }
146  }
147  hprvky[i] = prvek;
148 // deleni celeho radku
149  matice[prvek*rozmer+i] = 1.0;
150  for ( j=i+1; j<rozmer; ++j ) matice[prvek*rozmer+j]/=velprvku;
151  prstrana[prvek]/=velprvku;
152 // odecitani od ostatnich radku
153  for ( j=0; j<rozmer; ++j )
154  {
155  for ( k=0; k<=i; ++k )
156  {
157  if (hprvky[k]==j) break;
158  }
159  if (k>i)
160  {
161  for ( k=i+1; k<rozmer; ++k ) matice[j*rozmer+k]-=matice[j*rozmer+i]*matice[prvek*rozmer+k];
162  prstrana[j]-=matice[j*rozmer+i]*prstrana[prvek];
163  matice[j*rozmer+i]=0.0;
164  }
165  }
166  }
167 // zpetny chod
168  for ( i=rozmer-1; i>=0; --i )
169  {
170  for ( j=0; j<rozmer; ++j )
171  {
172  for ( k=i; k<rozmer; ++k )
173  {
174  if (hprvky[k]==j) break;
175  }
176  if (k==rozmer)
177  {
178  prstrana[j]-=matice[j*rozmer+i]*prstrana[hprvky[i]];
179  matice[j*rozmer+i]=0.0;
180  }
181  }
182  }
183  if (G_prm.vypisy>4) printf("o.k. (che_Gauss)");
184 
185  return 0;
186 }
187 
188 double che_poww (double A, int b, int *error)
189 {
190  int i = 0;
191  int B = 0;
192  double vystup=1.0;
193 
194  *error = 0;
195  B = b;
196  //
197  if (b<0) B = -b;
198  if (b==0) return 1.0;
199  if (A==0.0)
200  {
201  if (b>0)
202  {
203  return 0.0;
204  }
205  else
206  {
207  printf ("chyba pri mocneni %f**%d !\n", A, b);
208  *error = 1;
209 // exit(111);
210  return 1.0e99; // cislo vycucane z prstu
211  }
212  }
213  for (i=0; i<B; i++)
214  {
215  vystup *= A;
216  }
217  if (b<0)
218  {
219  vystup=1.0/vystup;
220  }
221 
222  return vystup;
223 }
224 
225 double che_poww_ld (double A, double b, int *error)
226 {
227  int B = 0;
228 
229  if (floor(b)==b)
230  {
231  B=(int) b;
232  return che_poww(A,B,error);
233  }
234  else
235  {
236  *error = 0;
237  if (A<0.0)
238  {
239  printf ("chyba pri mocneni %f**%f !\n", A, b);
240  *error = -1;
241 // exit(111);
242  return 0.0; // cislo vycucane z prstu
243  }
244  else if (A==0.0)
245  {
246  if (b<0.0)
247  {
248  printf ("chyba pri mocneni %f**%f !\n", A, b);
249  *error = 1;
250 // exit(111);
251  return 1.0e99; // cislo vycucane z prstu
252  }
253  else
254  {
255  return 0.0;
256  }
257  }
258  else
259  {
260  return exp(log(A)*b);
261  }
262  }
263 }
264 
265 double che_m_ (int latka, double *zeta)
266 {
267  int i = 0;
268  double mm = 0.0;
269 
270  mm=P_lat[latka].m0;
271  for (i=0; i<G_prm.pocet_reakci_pro_matici; i++)
272  {
273  mm += zeta[i]*P_che[i].stech_koef_p[latka];
274  }
275  return mm;
276 }
277 
278 double che_m_x (int latka, double *zeta, double krat)
279 {
280  int i = 0;
281  double mm = 0.0;
282 
283  mm=P_lat[latka].m0;
284  for (i=0; i<G_prm.pocet_reakci_pro_matici; i++)
285  {
286  mm += krat*zeta[i]*P_che[i].stech_koef_p[latka];
287  }
288  return mm;
289 }
290 
291 double che_m (int latka, double *zeta)
292 {
293  double mm = 0.0;
294 
295  mm = che_m_(latka, zeta);
296  if (mm<0.0)
297  {
298  }
299  return mm;
300 }
301 
302 double che_I (double *zeta)
303 {
304  double vystup = 0.0;
305  int i = 0;
306 
307  vystup = 0.0;
308  for (i=0; i<G_prm.pocet_latekvefazi; i++)
309  {
310  vystup += che_m(i, zeta)*P_lat[i].Q*P_lat[i].Q;
311  }
312  vystup /= 2.0;
313  return vystup;
314 }
315 
316 double che_dI (int smer)
317 {
318  double vystup = 0.0;
319  int i = 0;
320 
321  vystup = 0.0;
322  for (i=0; i<G_prm.pocet_latekvefazi; i++)
323  {
324  vystup += P_che[smer].stech_koef_p[i]*P_lat[i].Q*P_lat[i].Q;
325  }
326  vystup /= 2.0;
327  return vystup;
328 }
329 
330 double che_gama_ (int i, double *zeta, int *error)
331 {
332  double vystup = 0.0;
333  double sqrtlI = 0.0;
334 
335  *error = 0;
336  if (G_prm.vypisy>4) printf("\nche_gama_:");//printf(/*Msg,*/ "\nche_gama_:");
337  if (che_I(zeta)<0.0)
338  {
339  printf ("che_I(zeta)=%f!\n", che_I(zeta));
340  *error = 1;
341  }
342  sqrtlI = sqrt(fabs(che_I(zeta)));
343  vystup = -P_lat[i].Q*P_lat[i].Q*G_prm.Afi*(sqrtlI/(1.0+G_prm.b*sqrtlI)+2.0/G_prm.b*log(1.0+G_prm.b*sqrtlI));
344  vystup = exp(vystup);
345 
346  if (G_prm.vypisy>4) printf(/*Msg,*/ "o.k.(che_gama_)");
347  return vystup;
348 }
349 
350 double che_dgama_ (int i, double *zeta, int smer, int *error)
351 {
352  double vystup = 0.0;
353  double sqrtlI = 0.0;
354  double pom = 0.0;
355 
356  error = 0;
357  if (G_prm.vypisy>4) printf(/*Msg,*/ "\nche_dgama_:");
358  if (che_dI(smer)==0.0)
359  {
360  return 0.0;
361  }
362  if (che_I(zeta)<0.0)
363  {
364  printf ("che_I(zeta)=%f!\n", che_I(zeta));
365 // exit (123);
366  *error = 1;
367  }
368  sqrtlI = sqrt(fabs(che_I(zeta)));
369  if (sqrtlI==0.0)
370  {
371  printf(/*Msg,*/ "sqrtlI = 0.0, posouvam ve smeru: ");
372  pom = zeta[smer];
373  zeta[smer]+=DROBNY_POSUN; // cislo vycucane z prstu
374  sqrtlI = sqrt(fabs(che_I(zeta)));
375  zeta[smer]=pom;
376  printf(/*Msg,*/ "sqrtlI = %f\n", sqrtlI);
377  if (che_I(zeta)<0.0)
378  {
379  printf ("che_I(zeta)=%f, posouvam proti smeru: ", che_I(zeta));
380  zeta[smer]-=DROBNY_POSUN; // cislo vycucane z prstu
381  sqrtlI = sqrt(fabs(che_I(zeta)));
382  zeta[smer]=pom;
383  printf(/*Msg,*/ "sqrtlI = %f\n", sqrtlI);
384  }
385  }
386  vystup = -P_lat[i].Q*P_lat[i].Q*G_prm.Afi*(sqrtlI/(1.0+G_prm.b*sqrtlI)+2.0/G_prm.b*log(1.0+G_prm.b*sqrtlI));
387  vystup = exp(vystup);
388  vystup*= -P_lat[i].Q*P_lat[i].Q*G_prm.Afi;
389  vystup*= (3.0+2.0*G_prm.b*sqrtlI)/(1.0+G_prm.b*sqrtlI)/(1.0+G_prm.b*sqrtlI);
390  if (sqrtlI==0.0)
391  {
392  printf(/*Msg,*/ "sqrtlI = 0.0: ");
393  vystup *= 1.0e56; // cislo vycucane z prstu
394  printf(/*Msg,*/ "vystup = %f\n", vystup);
395  }
396  else
397  {
398  vystup/= 2.0*sqrtlI;
399  }
400  vystup*= che_dI(smer);
401  if (G_prm.vypisy>4) printf(/*Msg,*/ "o.k.(che_dgama_)");
402 
403  return vystup;
404 }
405 
406 double che_K1_( double *zeta, int rce, int vnoreni)
407 {
408  int i = 0;
409  double k1 = 0.0;
410  int chyba = 0;
411  double pom = 0.0;
412 
413  if (vnoreni>2*PUL_POCTU_VNORENI) // cislo vycucane z prstu
414  {
415  printf(/*Msg,*/ "k1 se moc spatne pocita, koncim!");
416  exit (222);
417  }
418  if (G_prm.vypisy>4) printf(/*Msg,*/ "\n (che_K1_)");
419  if (P_che[rce].typ_reakce==2)
420  {
421  k1=0.0;
422  for (i=0; i<G_prm.pocet_latekvefazi; i++)
423  {
424  k1+=che_m(i,zeta)*P_che[rce].exponent[i];
425  }
426  return k1;
427  }
428  else if (P_che[rce].typ_reakce==1)
429  {
430  k1=1.0;
431  for (i=0; i<G_prm.pocet_latekvefazi; i++)
432  {
433  k1*=che_poww_ld(che_m(i,zeta),P_che[rce].exponent[i],&chyba);
434  if (chyba > 0)
435  {
436  // nula na zaporne cislo nebo zaporne cislo na necele cislo!
437  pom = zeta[rce];
438  if (vnoreni < PUL_POCTU_VNORENI) // cislo vycucane z prstu
439  {
440  printf(/*Msg,*/ "k1 se spatne pocita, posouvam ve smeru: ");
441  zeta[rce]+=DROBNY_POSUN; // cislo vycucane z prstu
442  }
443  else if (vnoreni == PUL_POCTU_VNORENI) // cislo vycucane z prstu
444  {
445  printf(/*Msg,*/ "k1 se spatne pocita, posouvam poprve proti smeru: ");
446  zeta[rce]-=(PUL_POCTU_VNORENI+1)*DROBNY_POSUN; // cislo vycucane z prstu
447  }
448  else
449  {
450  printf(/*Msg,*/ "k1 se spatne pocita, posouvam proti smeru: ");
451  zeta[rce]-=DROBNY_POSUN; // cislo vycucane z prstu
452  }
453  k1 = che_K1_(zeta, rce, vnoreni+1);
454  zeta[rce]=pom;
455  return k1;
456  }
457  }
458  if (k1 == 0.0)
459  {
460  if (zeta[rce]==0.0)
461  {
462  k1 = 0.0;
463  }
464  else
465  {
466  k1 = zeta[rce]*1e99; // cislo vycucane z prstu
467  }
468  }
469  else
470  {
471  k1 = zeta[rce]/k1;
472  }
473  return k1;
474  }
475  else
476  {
477  k1=1.0;
478  for (i=0; i<G_prm.pocet_latekvefazi; i++)
479  {
480  k1*=che_poww(che_m(i,zeta),P_che[rce].stech_koef_p[i],&chyba);
481  if (chyba > 0)
482  {
483  // nula na zaporne cislo!
484  pom = zeta[rce];
485  if (vnoreni < PUL_POCTU_VNORENI) // cislo vycucane z prstu
486  {
487  printf(/*Msg,*/ "k1 se spatne pocita, posouvam ve smeru: ");
488  zeta[rce]+=DROBNY_POSUN; // cislo vycucane z prstu
489  }
490  else if (vnoreni == PUL_POCTU_VNORENI) // cislo vycucane z prstu
491  {
492  printf(/*Msg,*/ "k1 se spatne pocita, posouvam poprve proti smeru: ");
493  zeta[rce]-=(PUL_POCTU_VNORENI+1)*DROBNY_POSUN;// cislo vycucane z prstu
494  }
495  else
496  {
497  printf(/*Msg,*/ "k1 se spatne pocita, posouvam proti smeru: ");
498  zeta[rce]-=DROBNY_POSUN; // cislo vycucane z prstu
499  }
500  k1 = che_K1_(zeta, rce, vnoreni+1);
501  zeta[rce]=pom;
502  return k1;
503  }
504  }
505  return k1;
506  }
507 }
508 
509 double che_K2_( double *zeta, int rce, int vnoreni)
510 {
511  int i = 0;
512  double k2 = 0.0;
513  int chyba = 0;
514  int chybicka = 0;
515  double pom = 0.0;
516 
517  if (vnoreni>2*PUL_POCTU_VNORENI) // cislo vycucane z prstu
518  {
519  printf(/*Msg,*/ "k2 se moc spatne pocita, koncim!");
520  exit (222);
521  }
522  if (G_prm.vypisy>4) printf(/*Msg,*/ "\n (che_K2_)");
523  if (P_che[rce].typ_reakce!=0)
524  {
525  return 1.0;
526  }
527  k2=1.0;
528  for (i=0; i<G_prm.pocet_latekvefazi; i++)
529  {
530  k2*=che_poww(che_gama_(i,zeta,&chybicka),P_che[rce].stech_koef_p[i],&chyba);
531  if (chybicka > 0)
532  {
533  // zaporna iontova sila!
534  printf(/*Msg,*/ "Zaporna iontova sila - ");
535  chyba += 1;
536  }
537  if (chyba > 0)
538  {
539  // nula na zaporne cislo!
540  pom = zeta[rce];
541  if (vnoreni < PUL_POCTU_VNORENI) // cislo vycucane z prstu
542  {
543  printf(/*Msg,*/ "k2 se spatne pocita, posouvam ve smeru: ");
544  zeta[rce]+=DROBNY_POSUN; // cislo vycucane z prstu
545  }
546  else if (vnoreni == PUL_POCTU_VNORENI) // cislo vycucane z prstu
547  {
548  printf(/*Msg,*/ "k2 se spatne pocita, posouvam poprve proti smeru: ");
549  zeta[rce]-=(PUL_POCTU_VNORENI+1)*DROBNY_POSUN; // cislo vycucane z prstu
550  }
551  else
552  {
553  printf(/*Msg,*/ "k2 se spatne pocita, posouvam proti smeru: ");
554  zeta[rce]-=DROBNY_POSUN; // cislo vycucane z prstu
555  }
556  k2 = che_K2_(zeta, rce, vnoreni+1);
557  zeta[rce]=pom;
558  return k2;
559  }
560  }
561  return k2;
562 }
563 
564 double che_lnKT0(int rce)
565 {
566  int i = 0;
567  double kk = 0.0;
568 
569  kk=0.0;
570  for (i=0; i<G_prm.pocet_latek; i++)
571  {
572  kk+=P_che[rce].stech_koef_p[i]*P_lat[i].dGf;
573  }
574  kk/=-1.0*_R*G_prm.TGf;
575 
576  return kk;
577 }
578 
579 double che_dH(int rce)
580 {
581  int i = 0;
582  double hh = 0.0;
583 
584  hh=0.0;
585  for (i=0; i<G_prm.pocet_latek; i++)
586  {
587  hh+=P_che[rce].stech_koef_p[i]*P_lat[i].dHf;
588  }
589 
590  return hh;
591 }
592 
593 double che_K_(int rce)
594 {
595  int i = 0;
596  double kk = 0.0;
597  int chyba = 0;
598 
599  if (G_prm.vypisy>4) printf(/*Msg,*/ "\n (che_K_)");
600  if (P_che[rce].typ_reakce==2)
601  {
602  kk=P_che[rce].K;
603  return kk;
604  }
605  else if (P_che[rce].typ_reakce==1)
606  {
607  kk=1.0;
608  for (i=0; i<G_prm.pocet_latekvefazi; i++)
609  {
610  kk *= che_poww_ld(P_lat[i].m0,fabs(P_che[rce].exponent[i]),&chyba);
611  if (chyba > 0)
612  {
613  // nula na zaporne cislo nebo zaporne cislo na necely exponent!
614  printf(/*Msg,*/ "K se moc spatne pocita, koncim!");
615  exit (222);
616  }
617  }
618  if (kk > ACCURACY)
619  {
620  kk=P_che[rce].K*G_prm.deltaT;
621  }
622  return kk;
623  }
624  else
625  {
626  if (P_che[rce].K>0.0)
627  kk = P_che[rce].K;
628  else
629  {
630  kk=exp(che_lnKT0(rce)-che_dH(rce)*_R*(1.0/G_prm.T-1.0/G_prm.TGf));
631  }
632 
634  {
635  for (i=G_prm.pocet_latekvefazi; i<G_prm.pocet_latek; i++)
636  {
637  kk/=che_poww(P_lat[i].aktivita,P_che[rce].stech_koef_p[i],&chyba);
638  if (chyba > 0)
639  {
640  // nula na zaporne cislo!
641  printf(/*Msg,*/ "K se moc spatne pocita, koncim!");
642  exit (222);
643  }
644  }
645  }
646  return kk;
647  }
648 }
649 
650 double che_dK1_(double *zeta, int rce, int smer, int vnoreni)
651 {
652  int i = 0;
653  int j = 0;
654  double dk1 = 0.0;
655  double pomm = 0.0;
656  int chyba = 0;
657  double pom = 0.0;
658 
659  if (vnoreni>2*PUL_POCTU_VNORENI) // cislo vycucane z prstu
660  {
661  printf(/*Msg,*/ "dk1 se moc spatne pocita, koncim!");
662  exit (222);
663  }
664  if (G_prm.vypisy>4) printf(/*Msg,*/ "\n (che_dK1_)");
665  if (P_che[rce].typ_reakce==2)
666  {
667  dk1 = 0.0;
668  for (i=0; i<G_prm.pocet_latekvefazi; i++)
669  {
670  dk1+=P_che[rce].exponent[i]*P_che[smer].stech_koef_p[i];
671  }
672  return dk1;
673  }
674  else if (P_che[rce].typ_reakce==1)
675  {
676  dk1 = 0.0;
677  if ( rce == smer )
678  {
679  dk1=1.0;
680  for (i=0; i<G_prm.pocet_latekvefazi; i++)
681  {
682  dk1*=che_poww_ld(che_m(i,zeta),-1.0*P_che[rce].exponent[i],&chyba);
683  if (chyba > 0)
684  {
685  pom = zeta[rce];
686  if (vnoreni < PUL_POCTU_VNORENI) // cislo vycucane z prstu
687  {
688  printf(/*Msg,*/ "dk1 se spatne pocita, posouvam ve smeru: ");
689  zeta[rce]+=DROBNY_POSUN; // cislo vycucane z prstu
690  }
691  else if (vnoreni == PUL_POCTU_VNORENI) // cislo vycucane z prstu
692  {
693  printf(/*Msg,*/ "dk1 se spatne pocita, posouvam poprve proti smeru: ");
694  zeta[rce]-=(PUL_POCTU_VNORENI+1)*DROBNY_POSUN; // cislo vycucane z prstu
695  }
696  else
697  {
698  printf(/*Msg,*/ "dk1 se spatne pocita, posouvam proti smeru: ");
699  zeta[rce]-=DROBNY_POSUN; // cislo vycucane z prstu
700  }
701  dk1 = che_dK1_(zeta, rce, smer, vnoreni+1);
702  zeta[rce]=pom;
703  return dk1;
704  }
705  }
706  }
707  for (i=0; i<G_prm.pocet_latekvefazi; i++)
708  {
709  pomm = 1.0;
710  for (j=0; j<G_prm.pocet_latekvefazi; j++)
711  {
712  if (j!=i)
713  {
714  pomm*=che_poww_ld(che_m(j,zeta),-1.0*P_che[rce].exponent[j],&chyba);
715  if (chyba > 0)
716  {
717  // nula na zaporne cislo nebo zaporne cislo na necele cislo!
718  pom = zeta[rce];
719  if (vnoreni < PUL_POCTU_VNORENI) // cislo vycucane z prstu
720  {
721  printf(/*Msg,*/ "dk1 se spatne pocita, posouvam ve smeru: ");
722  zeta[rce]+=DROBNY_POSUN; // cislo vycucane z prstu
723  }
724  else if (vnoreni == PUL_POCTU_VNORENI) // cislo vycucane z prstu
725  {
726  printf(/*Msg,*/ "dk1 se spatne pocita, posouvam poprve proti smeru: ");
727  zeta[rce]-=(PUL_POCTU_VNORENI+1)*DROBNY_POSUN; // cislo vycucane z prstu
728  }
729  else
730  {
731  printf(/*Msg,*/ "dk1 se spatne pocita, posouvam proti smeru: ");
732  zeta[rce]-=DROBNY_POSUN; // cislo vycucane z prstu
733  }
734  dk1 = che_dK1_(zeta, rce, smer, vnoreni+1);
735  zeta[rce]=pom;
736  return dk1;
737  }
738  }
739  }
740  if (P_che[rce].stech_koef_p[i]!=0)
741  {
742  pomm*=che_poww_ld(che_m(i,zeta),-1.0*P_che[rce].exponent[i]-1.0,&chyba)*(-1.0*P_che[rce].exponent[i])*(P_che[smer].stech_koef_p[i]);
743  if (chyba > 0)
744  {
745  // nula na zaporne cislo nebo zaporne cislo na necele cislo!
746  pom = zeta[rce];
747  if (vnoreni < PUL_POCTU_VNORENI) // cislo vycucane z prstu
748  {
749  printf(/*Msg,*/ "dk1 se spatne pocita, posouvam ve smeru: ");
750  zeta[rce]+=DROBNY_POSUN; // cislo vycucane z prstu
751  }
752  else if (vnoreni == PUL_POCTU_VNORENI) // cislo vycucane z prstu
753  {
754  printf(/*Msg,*/ "dk1 se spatne pocita, posouvam poprve proti smeru: ");
755  zeta[rce]-=(PUL_POCTU_VNORENI+1)*DROBNY_POSUN; // cislo vycucane z prstu
756  }
757  else
758  {
759  printf(/*Msg,*/ "dk1 se spatne pocita, posouvam proti smeru: ");
760  zeta[rce]-=DROBNY_POSUN; // cislo vycucane z prstu
761  }
762  dk1 = che_dK1_(zeta, rce, smer, vnoreni+1);
763  zeta[rce]=pom;
764  return dk1;
765  }
766  }
767  else
768  {
769  pomm = 0.0;
770  }
771  dk1 += zeta[rce]*pomm;
772  }
773  return dk1;
774  }
775  else // typ_reakce == 0
776  {
777  dk1=0.0;
778  for (i=0; i<G_prm.pocet_latekvefazi; i++)
779  {
780  pomm = 1.0;
781  for (j=0; j<G_prm.pocet_latekvefazi; j++)
782  {
783  if (j!=i)
784  {
785  pomm*=che_poww(che_m(j,zeta),P_che[rce].stech_koef_p[j],&chyba);
786  if (chyba > 0)
787  {
788  // nula na zaporne cislo!
789  pom = zeta[rce];
790  if (vnoreni < PUL_POCTU_VNORENI) // cislo vycucane z prstu
791  {
792  printf(/*Msg,*/ "dk1 se spatne pocita, posouvam ve smeru: ");
793  zeta[rce]+=DROBNY_POSUN; // cislo vycucane z prstu
794  }
795  else if (vnoreni == PUL_POCTU_VNORENI) // cislo vycucane z prstu
796  {
797  printf(/*Msg,*/ "dk1 se spatne pocita, posouvam poprve proti smeru: ");
798  zeta[rce]-=(PUL_POCTU_VNORENI+1)*DROBNY_POSUN; // cislo vycucane z prstu
799  }
800  else
801  {
802  printf(/*Msg,*/ "dk1 se spatne pocita, posouvam proti smeru: ");
803  zeta[rce]-=DROBNY_POSUN; // cislo vycucane z prstu
804  }
805  dk1 = che_dK1_(zeta, rce, smer, vnoreni+1);
806  zeta[rce]=pom;
807  return dk1;
808  }
809  }
810  }
811  if (P_che[rce].stech_koef_p[i]!=0)
812  {
813  pomm*=che_poww(che_m(i,zeta),P_che[rce].stech_koef_p[i]-1,&chyba)*(P_che[rce].stech_koef_p[i])*(P_che[smer].stech_koef_p[i]);
814  if (chyba > 0)
815  {
816  // nula na zaporne cislo!
817  pom = zeta[rce];
818  if (vnoreni < PUL_POCTU_VNORENI) // cislo vycucane z prstu
819  {
820  printf(/*Msg,*/ "dk1 se spatne pocita, posouvam ve smeru: ");
821  zeta[rce]+=DROBNY_POSUN; // cislo vycucane z prstu
822  }
823  else if (vnoreni == PUL_POCTU_VNORENI) // cislo vycucane z prstu
824  {
825  printf(/*Msg,*/ "dk1 se spatne pocita, posouvam poprve proti smeru: ");
826  zeta[rce]-=(PUL_POCTU_VNORENI+1)*DROBNY_POSUN; // cislo vycucane z prstu
827  }
828  else
829  {
830  printf(/*Msg,*/ "dk1 se spatne pocita, posouvam proti smeru: ");
831  zeta[rce]-=DROBNY_POSUN; // cislo vycucane z prstu
832  }
833  dk1 = che_dK1_(zeta, rce, smer, vnoreni+1);
834  zeta[rce]=pom;
835  return dk1;
836  }
837  }
838  else
839  {
840  pomm = 0.0;
841  }
842  dk1+=pomm;
843  }
844  return dk1;
845  }
846 }
847 
848 double che_dK2_(double *zeta, int rce, int smer, int vnoreni)
849 {
850  int i = 0;
851  int j = 0;
852  double dk2 = 0.0;
853  double pomm = 0.0;
854  int chyba = 0;
855  int chybicka = 0;
856  int chybicka2 = 0;
857  double pom = 0.0;
858 
859  if (vnoreni>2*PUL_POCTU_VNORENI) // cislo vycucane z prstu
860  {
861  printf(/*Msg,*/ "dk2 se moc spatne pocita, koncim!");
862  exit (222);
863  }
864  if (G_prm.vypisy>4) printf(/*Msg,*/ "\n (che_dK2_)");
865  if (P_che[rce].typ_reakce) return 0.0;
866  dk2=0.0;
867  for (i=0; i<G_prm.pocet_latekvefazi; i++)
868  {
869  pomm = 1.0;
870  for (j=0; j<G_prm.pocet_latekvefazi; j++)
871  {
872  if (j!=i)
873  {
874  pomm*=che_poww(che_gama_(j,zeta,&chybicka),P_che[rce].stech_koef_p[j],&chyba);
875  if (chybicka > 0)
876  {
877  // zaporna iontova sila!
878  printf(/*Msg,*/ "Zaporna iontova sila - ");
879  chyba += 1;
880  }
881  if (chyba > 0)
882  {
883  // nula na zaporne cislo!
884  pom = zeta[rce];
885  if (vnoreni < PUL_POCTU_VNORENI) // cislo vycucane z prstu
886  {
887  printf(/*Msg,*/ "dk2 se spatne pocita, posouvam ve smeru: ");
888  zeta[rce]+=DROBNY_POSUN; // cislo vycucane z prstu
889  }
890  else if (vnoreni == PUL_POCTU_VNORENI) // cislo vycucane z prstu
891  {
892  printf(/*Msg,*/ "dk2 se spatne pocita, posouvam poprve proti smeru: ");
893  zeta[rce]-=(PUL_POCTU_VNORENI+1)*DROBNY_POSUN; // cislo vycucane z prstu
894  }
895  else
896  {
897  printf(/*Msg,*/ "dk2 se spatne pocita, posouvam proti smeru: ");
898  zeta[rce]-=DROBNY_POSUN; // cislo vycucane z prstu
899  }
900  dk2 = che_dK2_(zeta, rce, smer, vnoreni+1);
901  zeta[rce]=pom;
902  return dk2;
903  }
904  }
905  }
906  if (P_che[rce].stech_koef_p[i]!=0)
907  {
908  dk2+=pomm*P_che[rce].stech_koef_p[i]*che_poww(che_gama_(i,zeta,&chybicka),P_che[rce].stech_koef_p[i]-1,&chyba)*che_dgama_(i,zeta,smer,&chybicka2);
909  if ((chybicka + chybicka2) > 0)
910  {
911  // zaporna iontova sila!
912  printf(/*Msg,*/ "Zaporna iontova sila - ");
913  chyba += 1;
914  }
915  if (chyba > 0)
916  {
917  // nula na zaporne cislo!
918  pom = zeta[rce];
919  if (vnoreni < PUL_POCTU_VNORENI) // cislo vycucane z prstu
920  {
921  printf(/*Msg,*/ "dk2 se spatne pocita, posouvam ve smeru: ");
922  zeta[rce]+=DROBNY_POSUN; // cislo vycucane z prstu
923  }
924  else if (vnoreni == PUL_POCTU_VNORENI) // cislo vycucane z prstu
925  {
926  printf(/*Msg,*/ "dk2 se spatne pocita, posouvam poprve proti smeru: ");
927  zeta[rce]-=(PUL_POCTU_VNORENI+1)*DROBNY_POSUN; // cislo vycucane z prstu
928  }
929  else
930  {
931  printf(/*Msg,*/ "dk2 se spatne pocita, posouvam proti smeru: ");
932  zeta[rce]-=DROBNY_POSUN; // cislo vycucane z prstu
933  }
934  dk2 = che_dK2_(zeta, rce, smer, vnoreni+1);
935  zeta[rce]=pom;
936  return dk2;
937  }
938  }
939  }
940  return dk2;
941 }
942 
943 double che_hodnota_(double *zeta, int rce)
944 {
945  double vystup = 0.0;
946 
947  if (G_prm.vypisy>4) printf(/*Msg,*/ "\nche_hodnota_:");
948  vystup = che_K1_(zeta,rce,0)*che_K2_(zeta,rce,0);
949  if (G_prm.vypisy>4) printf(/*Msg,*/ "o.k. (che_hodnota_)");
950 
951  return vystup;
952 }
953 
954 double che_derivace_(double *zeta, int rce, int smer)
955 {
956  double vystup = 0.0;
957 
958  if (G_prm.vypisy>4) printf(/*Msg,*/ "\nche_derivace_:");
959  vystup = che_K1_(zeta,rce,0)*che_dK2_(zeta,rce,smer,0)+che_K2_(zeta,rce,0)*che_dK1_(zeta,rce,smer,0);
960  if (G_prm.vypisy>4) printf(/*Msg,*/ "o.k. (che_derivace_)");
961 
962  return vystup;
963 }
964 
965 void che_hodnoty(double *zeta, double *hodnota, double *skala)
966 {
967  int i = 0;
968 
969  for (i=0;i<G_prm.pocet_reakci_pro_matici;i++)
970  {
971  hodnota[i]=che_hodnota_(zeta,i)*skala[i];
972  }
973 }
974 
975 void che_Jakobi(double *zeta, double *J, double *skala)
976 {
977  int i = 0;
978  int j =0;
979 
980  if (G_prm.vypisy>4) printf(/*Msg,*/ "\nche_Jakobi: ");
981  for (i=0;i<G_prm.pocet_reakci_pro_matici;i++)
982  {
983  for (j=0;j<G_prm.pocet_reakci_pro_matici;j++)
984  {
985  J[i*G_prm.pocet_reakci_pro_matici+j]=che_derivace_(zeta,i,j)*skala[i];
986  }
987  }
988  if (G_prm.vypisy>4) printf(/*Msg,*/ "o.k. (Jakobi)");
989 }
990 
991 double che_abs_norma(double *x)
992 {
993  int i = 0;
994  double vysl = 0.0;
995 
996  for (i=0;i<G_prm.pocet_reakci_pro_matici;i++)
997  {
998  vysl+=x[i]*x[i];
999  }
1000 
1001  return sqrt(vysl);
1002 }
1003 
1004 double che_rel_norma(double *x, double *K)
1005 {
1006  int i = 0;
1007 
1008  double vysl = 0.0;
1009  for (i=0;i<G_prm.pocet_reakci_pro_matici;i++)
1010  {
1011  vysl+=x[i]*x[i]/K[i]/K[i];
1012  }
1013 
1014  return sqrt(vysl);
1015 }
1016 
1017 double che_norma (double *x, double *K)
1018 {
1019  double norma = 0.0;
1020  FILE *fw;
1021 
1022  if (G_prm.abs_norma) norma=che_abs_norma(x);
1023  else norma=che_rel_norma(x,K);
1024  if (G_prm.vypisy>3)
1025  {
1026  fw = fopen(vystupni_soubor, "a");
1027  fprintf (fw, "\n> norma = %f", norma);
1028  fclose (fw);
1029  }
1030  return norma;
1031 }
1032 
1033 void che_odecti (double *x, double *y, double *z)
1034 {
1035  int i = 0;
1036 
1037  if (G_prm.vypisy>4) printf(/*Msg,*/ "\nche_odecti: ");
1038  for (i=0;i<G_prm.pocet_reakci_pro_matici;i++)
1039  {
1040  z[i]=x[i]-y[i];
1041  }
1042  if (G_prm.vypisy>4) printf(/*Msg,*/ "o.k. (che_odecti)");
1043 }
1044 
1045 void che_nasob_ld (double x, double *y, double *z, int delka)
1046 {
1047  int i = 0;
1048 
1049  if (G_prm.vypisy>4) printf(/*Msg,*/ "\nche_nasob_ld: ");
1050  for (i=0;i<delka;i++)
1051  {
1052  z[i]=x*y[i];
1053  }
1054  if (G_prm.vypisy>4) printf(/*Msg,*/ "o.k. (che_nasob_ld)");
1055 }
1056 
1057 void che_kombinuj4_ld (double x1, double *y1, double x2, double *y2, double x3, double *y3, double x4, double *y4, double *z, int delka)
1058 {
1059  int i = 0;
1060 
1061  if (G_prm.vypisy>4) printf(/*Msg,*/ "\nche_kombinuj4_ld: ");
1062  for (i=0;i<delka;i++)
1063  {
1064  z[i]=x1*y1[i]+x2*y2[i]+x3*y3[i]+x4*y4[i];
1065  }
1066  if (G_prm.vypisy>4) printf(/*Msg,*/ "o.k. (che_kombinuj4_ld)");
1067 }
1068 
1069 void che_nuluj_ld (double *z, int delka)
1070 {
1071  int i = 0;
1072 
1073  if (G_prm.vypisy>4) printf(/*Msg,*/ "\nche_nuluj_ld: ");
1074  for (i=0;i<delka;i++)
1075  {
1076  z[i]=0.0;
1077  }
1078  if (G_prm.vypisy>4) printf(/*Msg,*/ "o.k. (che_nuluj_ld)");
1079 }
1080 
1081 void che_kopiruj (double *y, double *z)
1082 {
1083  int i = 0;
1084 
1085  if (G_prm.vypisy>4) printf(/*Msg,*/ "\nkopiruj:");
1086  for (i=0;i<G_prm.pocet_reakci_pro_matici;i++)
1087  {
1088  z[i]=y[i];
1089  }
1090  if (G_prm.vypisy>4) printf(/*Msg,*/ "o.k. (kopiruj)");
1091 }
1092 
1093 void che_zgaussproprg ( double *prstrana, int *hprvky, double *vysl )
1094 {
1095  int ij = 0;
1096 
1097  for ( ij = 0; ij < G_prm.pocet_reakci_pro_matici; ++ij )
1098  {
1099  vysl[ij]=prstrana[hprvky[ij]];
1100  }
1101 }
1102 
1103 void che_napis_soubor_ld(FILE *fw, double *vektor, int delka)
1104 {
1105  int i;
1106  fprintf(fw,"(");
1107  for (i=0;i<delka;i++)
1108  {
1109  fprintf(fw,"%f",vektor[i]);
1110  if (i<(delka-1))
1111  {
1112  fprintf(fw,",");
1113  }
1114  }
1115  fprintf(fw,")");
1116 }
1117 
1118 void che_napismatici_soubor (char *soubor, double *matice, double *prstr)
1119 {
1120  int i = 0;
1121  int j = 0;
1122  FILE *fw;
1123 
1124  fw = fopen(soubor, "a");
1125  for ( i=0; i<G_prm.pocet_reakci_pro_matici; ++i )
1126  {
1127  fprintf (fw,"\n");
1128  for ( j=0; j<G_prm.pocet_reakci_pro_matici; ++j )
1129  {
1130  fprintf (fw,"%f ", matice[i*G_prm.pocet_reakci_pro_matici+j]);
1131  }
1132  fprintf (fw,"| %f", prstr[i]);
1133  }
1134  fclose(fw);
1135 }
1136 
1137 int che_odecti_s_korekci_ld(double *x, double *y, double *z, int delka)
1138 {
1139  int i = 0;
1140  int j = 0;
1141  int pruchodu = 0;
1142  int problem = 0;
1143  double *z0 = NULL;
1144  FILE *fw = NULL;
1145 
1146  if (G_prm.vypisy>4) printf(/*Msg,*/ "\nche_odecti_s_korekci_ld:");
1147  for (i=0;i<G_prm.pocet_latekvefazi;i++)
1148  {
1149  if (che_m(i,x) < 0.0)
1150  {
1151  printf ("m(%d,...)=%f je zaporne!\n",i,che_m(i,x));
1152  exit(112);
1153  }
1154  if (G_prm.vypisy>3) if (che_m(i,x) == 0.0)
1155  {
1156  printf ("m(%d,...)=%f je nulove!\n",i,che_m(i,x));
1157  }
1158  }
1159  z0 = (double *)malloc( delka*sizeof( double ));
1160  if ( z0 == NULL )
1161  {
1162  printf ("Malo pameti!\n");
1163  exit(0);
1164  }for(j = 0; j < delka; j++){ z0[j] = 0.0; }
1165 
1166  che_odecti(x,y,z0);
1167  pruchodu = 0;
1168  do
1169  {
1170  pruchodu++;
1171  if (pruchodu>MAX_POC_VNITR_CYK) // cislo vycucane z prstu
1172  {
1173  free (z0);
1174  z0 = NULL;
1175  return 1;
1176  }
1177  if (G_prm.vypisy>4)
1178  {
1179  fw = fopen(vystupni_soubor, "a");
1180  fprintf(fw,"\n %d. VNITRNI CYKLUS", pruchodu);
1181  fprintf(fw,"\nx=");
1182  che_napis_soubor_ld (fw, x, delka);
1183  fprintf(fw,"\ny=");
1184  che_napis_soubor_ld (fw, y, delka);
1185  fprintf(fw,"\nz0=");
1186  che_napis_soubor_ld (fw, z0, delka);
1187  fclose(fw);
1188  if (G_prm.vypisy>6)
1189  {
1190  fw = fopen(vystupni_soubor, "a");
1191  fprintf(fw,"\nmolality:");
1192  for (i=0;i<G_prm.pocet_latekvefazi;i++)
1193  {
1194  fprintf(fw,"\t%f",che_m(i,z0));
1195  }
1196  fclose (fw);
1197  }
1198  }
1199  problem = 0;
1200  for (i=0;i<G_prm.pocet_latekvefazi;i++)
1201  {
1202  if (che_m(i,z0) < 0.0)
1203  {
1204  if (G_prm.vypisy>4)
1205  {
1206  fw = fopen(vystupni_soubor, "a");
1207  fprintf(fw, "\nproblem: m(%d)=%f",i,che_m(i,z0));
1208  fclose (fw);
1209  }
1210  problem = 1;
1211  }
1212  }
1213  if (problem > 0)
1214  {
1215  che_nasob_ld(0.5, y, y, delka);
1216  che_odecti(x,y,z0);
1217  }
1218  }
1219  while (problem > 0);
1220  che_kopiruj (z0, z);
1221  if (G_prm.vypisy>4) printf(/*Msg,*/ "O.K.(che_odecti_s_korekci_ld)");
1222 
1223  free(z0);
1224  z0 = NULL;
1225  return 0;
1226 }
1227 
1228 void che_napis_stav_soubor(char *soubor, double *zeta, double *K, double *matice, double *prstr)
1229 {
1230  FILE *fw = NULL;
1231 
1232  fw = fopen(soubor, "a");
1233  fprintf (fw, "\n..zeta=");
1235  fprintf (fw, "\n.....K=");
1237  fprintf (fw, "\n.....J=");
1238  fclose(fw);
1239  che_napismatici_soubor (soubor, matice, prstr);
1240 }
1241 
1242 void che_srovnej (double *KK, double *skala)
1243 {
1244  int i = 0;
1245 
1246  if (G_prm.skaluj_matici > 0)
1247  {
1248  for ( i=0; i<G_prm.pocet_reakci_pro_matici; i++)
1249  {
1250  if (KK[i] != 0.0)
1251  {
1252  skala[i] = 1.0/KK[i];
1253  KK[i]=1.0;
1254  }
1255  }
1256  }
1257  else
1258  {
1259  for ( i=0; i<G_prm.pocet_reakci_pro_matici; i++)
1260  {
1261  skala[i] = 1.0;
1262  }
1263  }
1264 }
1265 
1267 {
1268  int i = 0;
1269 
1270  for (i=0; i<G_prm.pocet_latekvefazi; i++)
1271  {
1272  P_lat[i].m0=P_lat[i].m;
1273  }
1274 }
1275 
1276 double che_osklivost(double *zeta0, int *zapornych, int *nulovych, int *nejhorsi)
1277 {
1278  int i = 0;
1279  double pom = 0.0;
1280  double hodnota = 0.0;
1281  double vysledek = 0.0;
1282 
1283  if (G_prm.vypisy>4) printf(/*Msg,*/ "\nche_osklivost: ");
1284  vysledek = 0.0;
1285  *nejhorsi = -1;
1286  hodnota = 1.0;
1287  *zapornych = 0;
1288  *nulovych = 0;
1289  for ( i=0; i<G_prm.pocet_latekvefazi; i++)
1290  {
1291  pom = che_m(i,zeta0);
1292  if (pom <= 0.0)
1293  {
1294  if (pom == 0.0)
1295  {
1296  (*nulovych)++;
1297  }
1298  else
1299  {
1300  (*zapornych)++;
1301  vysledek -= pom;
1302  }
1303  if (pom<hodnota)
1304  {
1305  *nejhorsi = i;
1306  hodnota = pom;
1307  }
1308  }
1309  }
1310 
1311  if (vysledek>0.0)
1312  {
1313  vysledek += 1.0;
1314  }
1315  else
1316  {
1317  //neznama promenna nulovych
1318  vysledek = (1.0 * (*nulovych)) / G_prm.pocet_latekvefazi;
1319  }
1320  if (G_prm.vypisy>4) printf(/*Msg,*/ "o.k.(che_osklivost = %f)", vysledek);
1321  return vysledek;
1322 }
1323 
1325 {
1326  int i = 0;
1327  int j = 0;
1328  int k = 0;
1329  int x = 0;
1330  int y = 0;
1331  double *zeta0 = NULL;
1332  double *zeta = NULL;
1333  int zapornych0 = 0;
1334  int nulovych0 = 0;
1335  int nejhorsi0 = 0;
1336  double osklivost0 = 0.0;
1337  double osklivost = 0.0;
1338  int chyba = 0;
1339  int vratit = 0;
1340 
1341  vratit = 0;
1342  zeta0 = (double *)malloc( G_prm.pocet_reakci_pro_matici*sizeof( double ));
1343  if ( zeta0 == NULL )
1344  {
1345  printf ("Malo pameti!\n");
1346  exit(0);
1347  }for(j = 0; j < G_prm.pocet_reakci_pro_matici; j++){ zeta0[j] = 0.0; }
1348 
1349  zeta = (double *)malloc( G_prm.pocet_reakci_pro_matici*sizeof( double ));
1350  if ( zeta == NULL )
1351  {
1352  printf ("Malo pameti!\n");
1353  exit(0);
1354  }for(j = 0; j < G_prm.pocet_reakci_pro_matici; j++){ zeta[j] = 0.0; }
1355  for ( i=0; i<G_prm.pocet_reakci_pro_matici; i++)
1356  {
1357  zeta0[i]=0.0;
1358  }
1359  osklivost0=che_osklivost(zeta0, &zapornych0, &nulovych0, &nejhorsi0);
1360  if (osklivost0 <= 1.0)
1361  {
1362  if (osklivost0 != 0.0)
1363  {
1364  for ( i=1; i<che_poww(3.0,G_prm.pocet_reakci_pro_matici,&chyba); i++)
1365  {
1366  x = i;
1367  for ( j=0; j<G_prm.pocet_reakci_pro_matici; j++)
1368  {
1369  y=fmod(x,3.0);
1370  x /=3;
1371  if ((P_che[j].typ_reakce == 1)&& (y ==2))
1372  {
1373  continue;
1374  }
1375  switch (y)
1376  {
1377  case 0: zeta[j] =0.0; break;
1378  case 1: zeta[j] =DROBNY_POSUN; break; //cislo vycucane z prstu
1379  case 2: zeta[j] =-DROBNY_POSUN; break; //cislo vycucane z prstu
1380  }
1381  }
1382  osklivost=che_osklivost (zeta, &zapornych0, &nulovych0, &nejhorsi0);
1383  if (osklivost < osklivost0)
1384  {
1385  osklivost0 = osklivost;
1386  for ( k=0; k<G_prm.pocet_reakci_pro_matici; k++)
1387  {
1388  zeta0[k]=zeta[k];
1389  }
1390  }
1391  if (osklivost == 0.0) break;
1392  }
1393  }
1394  }
1395  else
1396  {
1397  vratit = 1;
1398  }
1399  for ( i=0; i<G_prm.pocet_reakci_pro_matici; i++)
1400  {
1401  P_che[i].zeta0 = zeta0[i];
1402  }
1403  if (osklivost0>0.0)
1404  {
1405  printf(/*Msg,*/ "\nzeta0 se nepodarilo nastavit (osklivost je 1.0+(%f))", osklivost0-1.0);
1406  }
1407  free(zeta0);
1408  zeta0 = NULL;
1409  free(zeta);
1410  zeta = NULL;
1411 
1412  return vratit;
1413 }
1414 
1415 void che_maticovy_vypocet (char *soubor)
1416 {
1417  int i = 0;
1418  int j = 0;
1419  int pruchodu = 0;
1420  double *zeta = NULL; //P_che[].zeta0;
1421  double *KK = NULL;//=K(rce);
1422  double *skala = NULL;
1423  double *J = NULL;
1424  double *hodnota = NULL;
1425  int *hprvky = NULL;
1426  double *delta = NULL;
1427  double *prstr = NULL;
1428  FILE *fw = NULL;
1429  double norma = 0.0;
1430  double stara_norma = 0.0;
1431  int stagnace = 0;
1432 
1433  if (G_prm.pocet_reakci_pro_matici == 0)
1434  {
1435  for (i=0; i<G_prm.pocet_latekvefazi; i++)
1436  {
1437  P_lat[i].m = P_lat[i].m0;
1438  }
1439  return;
1440  }
1441  if (che_urci_zeta0() > 0)
1442  {
1443  for (i=0; i<G_prm.pocet_latekvefazi; i++)
1444  {
1445  P_lat[i].m = P_lat[i].m0;
1446  }
1447  fw = fopen(soubor, "a");
1448  fprintf (fw,"\nchemie: URCITE NEKOREKTNI POCATECNI PODMINKA!\t");
1449  fclose(fw);
1450  return;
1451  }
1452  zeta = (double *)malloc( G_prm.pocet_reakci_pro_matici*sizeof( double ));
1453  if ( zeta == NULL )
1454  {
1455  printf ("Malo pameti!\n");
1456  exit(0);
1457  }for(j = 0; j < G_prm.pocet_reakci_pro_matici;j++){zeta[j] = 0.0;}
1458 
1459  prstr = (double *)malloc( G_prm.pocet_reakci_pro_matici*sizeof( double ));
1460  if ( prstr == NULL )
1461  {
1462  printf ("Malo pameti!\n");
1463  exit(0);
1464  }for(j = 0; j < G_prm.pocet_reakci_pro_matici;j++){prstr[j] = 0.0;}
1465 
1466  delta = (double *)malloc( G_prm.pocet_reakci_pro_matici*sizeof( double ));
1467  if ( delta == NULL )
1468  {
1469  printf ("Malo pameti!\n");
1470  exit(0);
1471  }for(j = 0; j < G_prm.pocet_reakci_pro_matici;j++){delta[j] = 0.0;}
1472 
1473  KK = (double *)malloc( G_prm.pocet_reakci_pro_matici*sizeof( double ));
1474  if ( KK == NULL )
1475  {
1476  printf ("Malo pameti!\n");
1477  exit(0);
1478  }for(j = 0; j < G_prm.pocet_reakci_pro_matici;j++){KK[j] = 0.0;}
1479 
1480  skala = (double *)malloc( G_prm.pocet_reakci_pro_matici*sizeof( double ));
1481  if ( skala == NULL )
1482  {
1483  printf ("Malo pameti!\n");
1484  exit(0);
1485  }for(j = 0; j < G_prm.pocet_reakci_pro_matici;j++){skala[j] = 0.0;}
1486 
1487  J = (double *)malloc( G_prm.pocet_reakci_pro_matici*G_prm.pocet_reakci_pro_matici*sizeof( double ));
1488  if ( J == NULL )
1489  {
1490  printf ("Malo pameti!\n");
1491  exit(0);
1492  }for(j = 0; j < G_prm.pocet_reakci_pro_matici;j++){J[j] = 0.0;}
1493 
1494  hodnota = (double *)malloc( G_prm.pocet_reakci_pro_matici*sizeof( double ));
1495  if ( hodnota == NULL )
1496  {
1497  printf ("Malo pameti!\n");
1498  exit(0);
1499  }for(j = 0; j < G_prm.pocet_reakci_pro_matici;j++){hodnota[j] = 0.0;}
1500  hprvky = (int *)malloc( G_prm.pocet_reakci_pro_matici*sizeof( int ));
1501  if ( hprvky == NULL )
1502  {
1503  printf ("Malo pameti!\n");
1504  exit(0);
1505  }for(j = 0; j < G_prm.pocet_reakci_pro_matici;j++){hprvky[j] = 0.0;}
1506  for ( i=0; i<G_prm.pocet_reakci_pro_matici; i++)
1507  {
1508  KK[i]=che_K_(i);
1509  zeta[i]=P_che[i].zeta0;
1510  }
1511  che_srovnej(KK,skala);
1512  if (G_prm.vypisy>1)
1513  {
1514  fw = fopen(soubor, "a");
1515  fprintf (fw,"\nK -> ");
1517  fclose(fw);
1518  }
1519 
1520  che_hodnoty(zeta,hodnota,skala);
1521  che_Jakobi(zeta,J,skala);
1522  che_odecti(hodnota, KK, prstr);
1523  if (G_prm.vypisy>2)
1524  {
1525  che_napis_stav_soubor(soubor,zeta, hodnota, J, prstr);
1526  }
1527  pruchodu = 0;
1528  stagnace = 0;
1529  stara_norma = che_norma(prstr,KK);
1530  while ((che_norma(prstr,KK)>G_prm.epsilon)&&(pruchodu < MAX_POC_VNEJ_CYK)&&(stagnace<MAX_STAGNACE)) // 2x cislo vycucane z prstu
1531  {
1532  pruchodu++;
1533  norma = che_norma(prstr,KK);
1534  if (norma>stara_norma)
1535  {
1536  G_prm.omega /= 2.0;
1537  if (G_prm.vypisy>4)
1538  {
1539  fw = fopen(soubor, "a");
1540  fprintf(fw,"\n ( - omega = %f )", G_prm.omega);
1541  fclose (fw);
1542  }
1543  stara_norma = norma;
1544  stagnace = 0;
1545  }
1546  else if (norma*1.5 < stara_norma) //cislo vycucane z prstu
1547  {
1548  G_prm.omega *= 2.0;
1549  if ( G_prm.omega > 1.5 ) //cislo vycucane z prstu
1550  {
1551  G_prm.omega = 1.5; //cislo vycucane z prstu
1552  }
1553  if ( G_prm.omega < -1.5 ) //cislo vycucane z prstu
1554  {
1555  G_prm.omega = -1.5; //cislo vycucane z prstu
1556  }
1557  if (G_prm.vypisy>4)
1558  {
1559  fw = fopen(soubor, "a");
1560  fprintf(fw,"\n ( + omega = %f )", G_prm.omega);
1561  fclose (fw);
1562  }
1563  stara_norma = norma;
1564  stagnace = 0;
1565  }
1566  else
1567  {
1568  stagnace++;
1569  }
1570  if (G_prm.vypisy>4)
1571  {
1572  fw = fopen(soubor, "a");
1573  fprintf(fw,"\n%d. VNEJSI CYKLUS", pruchodu);
1574  fclose (fw);
1575  if (G_prm.vypisy>5)
1576  {
1577  fw = fopen(soubor, "a");
1578  fprintf(fw,"\nmolality:");
1579  for (i=0;i<G_prm.pocet_latekvefazi;i++)
1580  {
1581  fprintf(fw,"\t%f",che_m(i,zeta));
1582  }
1583  fclose (fw);
1584  }
1585  }
1586  if (che_Gauss ( J, prstr, hprvky, G_prm.pocet_reakci_pro_matici) > 0)
1587  {
1588  fw = fopen(soubor, "a");
1589  fprintf (fw,"\nchemie: Gauss spadnul!");
1590  fclose(fw);
1591  exit(222);
1592  }
1593  che_zgaussproprg (prstr,hprvky,delta);
1594  if (G_prm.vypisy>2)
1595  {
1596  fw = fopen(soubor, "a");
1597  fprintf (fw, "\n> delta=");
1599  fclose(fw);
1600  }
1602  if (che_odecti_s_korekci_ld (zeta,delta,zeta,G_prm.pocet_reakci_pro_matici) > 0)
1603  {
1604  fw = fopen(soubor, "a");
1605  fprintf (fw,"\nchemie: PATRNE NEKOREKTNI POCATECNI PODMINKA!\t");
1606  fclose(fw);
1608  break;
1609  }
1610  che_hodnoty(zeta,hodnota,skala);
1611  che_Jakobi(zeta,J,skala);
1612  che_odecti(hodnota, KK, prstr);
1613  if (G_prm.vypisy>2)
1614  {
1615  che_napis_stav_soubor(soubor, zeta, hodnota, J, prstr);
1616  }
1617  }
1618  if (stagnace >= MAX_STAGNACE) // cislo vycucane z prstu
1619  {
1620  fw = fopen(soubor, "a");
1621  fprintf (fw, "\nchemie: NEMOHU DODRZET POZADOVANOU PRESNOST!\n");
1622  fclose(fw);
1623  }
1624  if (pruchodu >= MAX_POC_VNEJ_CYK) // cislo vycucane z prstu
1625  {
1626  fw = fopen(soubor, "a");
1627  fprintf (fw, "\nchemie: PATRNE PRILIS RYCHLE KINETICKE REAKCE!\t");
1628  fclose(fw);
1629  exit(223);
1630  }
1631  for (i=0; i<G_prm.pocet_latekvefazi; i++)
1632  {
1633  P_lat[i].m = che_m(i,zeta);
1634  P_lat[i].m0 = che_m(i,zeta);
1635  }
1636  free(KK);
1637  KK = NULL;
1638  free(zeta);
1639  zeta = NULL;
1640  free(delta);
1641  delta = NULL;
1642  free(prstr);
1643  prstr = NULL;
1644  free(hprvky);
1645  hprvky = NULL;
1646  free(hodnota);
1647  hodnota = NULL;
1648  free(J);
1649  J = NULL;
1650  free(skala);
1651  skala = NULL;
1652 }
1653 
1654 void che_spocitej_rychlosti(double *rychlosti, double *poloha, double dt)
1655 {
1656  int i = 0;
1657  int j = 0;
1658  int chyba = 0;
1659 
1661  {
1662  rychlosti[i-G_prm.pocet_reakci_pro_matici-G_prm.pocet_rozpadu] = P_che[i].K*dt;
1663  for (j=0;j < G_prm.pocet_latekvefazi;j++)
1664  {
1665  rychlosti[i-G_prm.pocet_reakci_pro_matici-G_prm.pocet_rozpadu] *= che_poww_ld(poloha[j],P_che[i].exponent[j],&chyba);
1666  if (G_prm.vypisy > 4)
1667  {
1668  printf(/*Msg,*/ "\n %d. rychlost %d. kineticke reakce %10.24f, poloha = %f, exponent = %f\n", j, i, rychlosti[i-G_prm.pocet_reakci_pro_matici-G_prm.pocet_rozpadu], poloha[j], P_che[i].exponent[j]);
1669  }
1670  if (chyba > 0)
1671  {
1672  // nula na zaporne cislo nebo zaporne cislo na necele cislo!
1673  }
1674  }
1675  }
1676 }
1677 
1678 void che_spocitej_posunuti (double *posunuti, double *rychlosti)
1679 {
1680  int i = 0;
1681  int j = 0;
1682 
1685  {
1686  for (j=0;j<G_prm.pocet_latekvefazi;j++)
1687  {
1688  posunuti[j] += P_che[i].stech_koef_p[j]*rychlosti[i-G_prm.pocet_reakci_pro_matici-G_prm.pocet_rozpadu];
1689  }
1690  }
1691 }
1692 
1693 void che_prepocitej_polohu (double *poloha2, double *poloha, double *posunuti)
1694 {
1695  int j = 0;
1696 
1697  for (j=0;j<G_prm.pocet_latekvefazi;j++)
1698  {
1699  poloha2[j] = poloha[j]+posunuti[j];
1700  }
1701 }
1702 
1703 void che_zkrat_latku_o(int kterou, double o_kolik, double *rychlosti)
1704 {
1705 // mozna bych mel vsechny reakce spotrebovavajici latku zkratit rovnym dilem.
1706  int i = 0;
1707  int reakce = 0;
1708  double maximum = 0.0;
1709 
1710  for (;;)
1711  {
1712  reakce = -1;
1713  maximum = 0.0;
1715  {
1716  if (-P_che[i].stech_koef_p[kterou]*rychlosti[i-G_prm.pocet_reakci_pro_matici-G_prm.pocet_rozpadu]>maximum)
1717  {
1718  maximum = -P_che[i].stech_koef_p[kterou]*rychlosti[i-G_prm.pocet_reakci_pro_matici-G_prm.pocet_rozpadu];
1719  reakce = i;
1720  }
1721  }
1722  if (reakce==-1)
1723  {
1724  printf(/*Msg,*/"\nchemie: Tohle se vubec nemelo stat, nerozumim tomu - nelze uz zkratit spotrebu latky!");
1725  //fclose(fw);
1726  exit(224);
1727  }
1728  if (maximum>=o_kolik)
1729  {
1730  rychlosti[reakce-G_prm.pocet_reakci_pro_matici-G_prm.pocet_rozpadu] += o_kolik/P_che[reakce].stech_koef_p[kterou];
1731  return;
1732  }
1733  else
1734  {
1735  o_kolik -= maximum;
1736  rychlosti[reakce-G_prm.pocet_reakci_pro_matici-G_prm.pocet_rozpadu] = 0.0;
1737  }
1738  }
1739 }
1740 
1741 void che_pomala_kinetika (char *soubor, int poc_kroku)
1742 {
1743  //FILE *fw;
1744  int i,j, krok;
1745  double *poloha = NULL;
1746  double *poloha2 = NULL;
1747  double *k1 = NULL;
1748  double *k2 = NULL;
1749  double *k3 = NULL;
1750  double *k4 = NULL;
1751  double *rychlosti = NULL;
1752  double *posunuti = NULL;
1753  double dt = 0.0;
1754 
1756  {
1757  printf ("POMALA KINETIKA POZADUJE, ABY NEEXISTOVALY JINE REAKCE NEZ PRO MATICI, POMALE KINETICKE A ROZPADY! %d %d %d %d !", G_prm.pocet_reakci_pro_matici,G_prm.pocet_rozpadu,G_prm.pocet_pom_kin,G_prm.celkovy_pocet_reakci);
1758  exit (115);
1759  }
1760  if (G_prm.pocet_pom_kin==0)
1761  {
1762  return;
1763  }
1764  if (G_prm.vypisy>4) printf(/*Msg,*/ "\nche_pomala_kinetika: ");
1765 
1766 // TOHLE JE JEDEN KROK RUNGE-KUTTA - mel bych priprogramovat moznost rozdelit vypocet na vic kroku
1767 
1768  poloha = (double *)malloc( (G_prm.pocet_latekvefazi)*sizeof( double ));
1769  if ( poloha == NULL )
1770  {
1771  printf ("Malo pameti!\n");
1772  exit(0);
1773  }for(i = 0;i < G_prm.pocet_latekvefazi; i++){ poloha[i] = 0.0; }
1774 
1775  poloha2 = (double *)malloc( (G_prm.pocet_latekvefazi)*sizeof( double ));
1776  if ( poloha2 == NULL )
1777  {
1778  printf ("Malo pameti!\n");
1779  exit(0);
1780  }for(i = 0;i < G_prm.pocet_latekvefazi; i++){ poloha2[i] = 0.0; }
1781 
1782  rychlosti = (double *)malloc( G_prm.pocet_pom_kin*sizeof( double ));
1783  if ( rychlosti == NULL )
1784  {
1785  printf ("Malo pameti!\n");
1786  exit(0);
1787  }for(i = 0;i < G_prm.pocet_pom_kin; i++){ rychlosti[i] = 0.0; }
1788 
1789  k1 = (double *)malloc( G_prm.pocet_pom_kin*sizeof( double ));
1790  if ( k1 == NULL )
1791  {
1792  printf ("Malo pameti!\n");
1793  exit(0);
1794  }for(i = 0;i < G_prm.pocet_pom_kin; i++){ k1[i] = 0.0; }
1795 
1796  k2 = (double *)malloc( G_prm.pocet_pom_kin*sizeof( double ));
1797  if ( k2 == NULL )
1798  {
1799  printf ("Malo pameti!\n");
1800  exit(0);
1801  }for(i = 0;i < G_prm.pocet_pom_kin; i++){ k2[i] = 0.0; }
1802 
1803  k3 = (double *)malloc( G_prm.pocet_pom_kin*sizeof( double ));
1804  if ( k3 == NULL )
1805  {
1806  printf ("Malo pameti!\n");
1807  exit(0);
1808  }for(i = 0;i < G_prm.pocet_pom_kin; i++){ k3[i] = 0.0; }
1809 
1810  k4 = (double *)malloc( G_prm.pocet_pom_kin*sizeof( double ));
1811  if ( k4 == NULL )
1812  {
1813  printf ("Malo pameti!\n");
1814  exit(0);
1815  }for(i = 0;i < G_prm.pocet_pom_kin; i++){ k4[i] = 0.0; }
1816 
1817  posunuti = (double *)malloc( G_prm.pocet_latekvefazi*sizeof( double ));
1818  if ( posunuti == NULL )
1819  {
1820  printf ("Malo pameti!\n");
1821  exit(0);
1822  }for(i = 0;i < G_prm.pocet_latekvefazi; i++){ posunuti[i] = 0.0; }
1823  dt= G_prm.deltaT / poc_kroku;
1824  for (krok = 0; krok<poc_kroku; krok++)
1825  {
1826  for (j=0;j<G_prm.pocet_latekvefazi;j++)
1827  {
1828  poloha[j] = P_lat[j].m0;
1829  if (P_lat[j].m0<0.0)
1830  {
1831  printf(/*Msg,*/ "\nchemie: Vstup do pomalych kinetickych reakci obsahoval zapornou molalitu %d. latky-neprobehne vypocet!!", j+1);
1832  free(rychlosti);
1833  rychlosti = NULL;
1834 
1835  free(k1);
1836  k1 = NULL;
1837 
1838  free(k2);
1839  k2 = NULL;
1840 
1841  free(k3);
1842  k3 = NULL;
1843 
1844  free(k4);
1845  k4 = NULL;
1846 
1847  free(posunuti);
1848  posunuti = NULL;
1849 
1850  free(poloha2);
1851  poloha2 = NULL;
1852 
1853  free(poloha);
1854  poloha = NULL;
1855  return;
1856  }
1857  }
1858  che_spocitej_rychlosti(k1, poloha, dt);
1859  che_nasob_ld (0.5, k1, rychlosti, G_prm.pocet_pom_kin);
1860  che_spocitej_posunuti(posunuti, rychlosti);
1861  che_prepocitej_polohu(poloha2, poloha, posunuti);
1862 
1863  che_spocitej_rychlosti(k2, poloha2, dt);
1864  che_nasob_ld (0.5, k2, rychlosti, G_prm.pocet_pom_kin);
1865  che_spocitej_posunuti(posunuti, rychlosti);
1866  che_prepocitej_polohu(poloha2, poloha, posunuti);
1867 
1868  che_spocitej_rychlosti(k3, poloha2, dt);
1869  che_spocitej_posunuti(posunuti, k3);
1870  che_prepocitej_polohu(poloha2, poloha, posunuti);
1871 
1872  che_spocitej_rychlosti(k4, poloha2, dt);
1873 
1874  che_kombinuj4_ld(1.0/6.0, k1, 1.0/3.0, k2, 1.0/3.0, k3, 1.0/6.0, k4, rychlosti, G_prm.pocet_pom_kin);
1875  che_spocitej_posunuti(posunuti, rychlosti);
1876  che_prepocitej_polohu(poloha2, poloha, posunuti);
1877 
1878  for (j=0;j<G_prm.pocet_latekvefazi;j++)
1879  {
1880  if (poloha2[j]<0.0)
1881  {
1882  printf(/*Msg,*/ "\nchemie: pri pomalych kinetickych reakcich dosla %d. latka (%f)\t", j+1, poloha2[j]);
1883  che_zkrat_latku_o(j,-poloha2[j],rychlosti);
1884  che_spocitej_posunuti(posunuti, rychlosti);
1885  che_prepocitej_polohu(poloha2, poloha, posunuti);
1886  }
1887  }
1888  for (j=0;j<G_prm.pocet_latekvefazi;j++)
1889  {
1890  P_lat[j].m0 = poloha2[j];
1891  P_lat[j].m = poloha2[j];
1892  if (P_lat[j].m0<0.0)
1893  {
1894  if (P_lat[j].m0>-1.e-20) // cislo vycucane z prstu
1895  {
1896  P_lat[j].m0 = 0.0;
1897  }
1898  else
1899  {
1900  printf(/*Msg,*/ "\nchemie: Tohle se vubec nemelo stat, nerozumim tomu - pomale kineticke reakce nejsou dost pomale!\n%d.latka (%f)", j+1,P_lat[j].m0);
1901  //fclose(fw);
1902  exit(224);
1903  }
1904  }
1905  }
1906  }
1907  free(rychlosti);
1908  rychlosti = NULL;
1909 
1910  free(k1);
1911  k1 = NULL;
1912 
1913  free(k2);
1914  k2 = NULL;
1915 
1916  free(k3);
1917  k3 = NULL;
1918 
1919  free(k4);
1920  k4 = NULL;
1921 
1922  free(posunuti);
1923  posunuti = NULL;
1924 
1925  free(poloha2);
1926  poloha2 = NULL;
1927 
1928  free(poloha);
1929  poloha = NULL;
1930 //
1931  //fclose (fw);
1932  if (G_prm.vypisy>4) printf(/*Msg,*/ "o.k. (che_pomala_kinetika)");
1933 }
1934 
1935 void che_vypocet_rovnovah (char *soubor)
1936 {
1938  che_maticovy_vypocet(soubor);
1940 }
1941 
1942 void che_rovnovahy_se_sorpci(char *soubor)
1943 {
1944 // sem muzu vrazit cyklus
1945  che_vypocet_rovnovah(soubor);
1947 }
1948 
1949 void che_matice_se_sorpci(char *soubor)
1950 {
1951 // sem nesmim vrazit cyklus - jsou tam i kineticke reakce
1952  che_maticovy_vypocet(soubor);
1954 }
1955 
1956 void che_pocitej_soubor(char *soubor, int *poc_krok)
1957 {
1958  if (poc_krok > 0)
1959  {
1960  {
1961  che_rovnovahy_se_sorpci(soubor);
1962  }
1963  poc_krok = 0;
1964  }
1966  che_matice_se_sorpci(soubor);
1967 }
1968 
1969 //*************************************************************************
1970 // FUNKCE NA NACTENI CHEMIE PRO TRANSPORT
1971 //*************************************************************************
1973 {
1974 }
1975 
1977 {
1978  int i = 0;
1979  int j = 0;
1980  printf(/*Msg,*/ "\nPRM: ");
1982  printf(/*Msg,*/ "%f %f %f %f %f %f ",G_prm.T,G_prm.Afi,G_prm.b,G_prm.epsilon,G_prm.omega,G_prm.deltaT);
1983  printf(/*Msg,*/ "%d %d",G_prm.cas_kroku,G_prm.vypisy);
1984 
1985  printf(/*Msg,*/ "\nLAT: ");
1986  for (i=0; i<G_prm.pocet_latek; i++)
1987  {
1988  printf(/*Msg,*/ "\n (%d): ", i);
1989  printf(/*Msg,*/ "%d. %f %f %f %f %d %f",i,P_lat[i].m0,P_lat[i].m,P_lat[i].M,P_lat[i].dGf,P_lat[i].Q,P_lat[i].aktivita);
1990  }
1991 
1992  printf(/*Msg,*/ "\nCHE: ");
1993  for (i=0; i<G_prm.celkovy_pocet_reakci; i++)
1994  {
1995  printf(/*Msg,*/ "\n (%d): ", i);
1996  printf(/*Msg,*/ "%d %f %d %f",i,P_che[i].K,P_che[i].typ_reakce,P_che[i].zeta0);
1997  printf(/*Msg,*/ "\n stech. koef.: ");
1998  for (j = 0; j<G_prm.pocet_latek; j++)
1999  {
2000  printf(/*Msg,*/ "%d ", P_che[i].stech_koef_p[j]);
2001  }
2002  printf(/*Msg,*/ "\n exponenty: ");
2003  for (j = 0; j<G_prm.pocet_latekvefazi; j++)
2004  {
2005  printf(/*Msg,*/ "%f ", P_che[i].exponent[j]);
2006  }
2007  }
2008 }
2009 
2010 /********************************************************************/
2011 /* Uvolnuje pamet */
2012 /********************************************************************/
2013 void che_uvolneni_P( void )
2014 {
2015  printf(/*Msg,*/ "Uvolneni che_ P_lat, P_che : " );
2016  if ( P_lat != NULL )
2017  {
2018  free( P_lat ); P_lat = NULL;
2019  }
2020  printf(/*Msg,*/ "O.k., " );
2021  if ( P_che != NULL )
2022  {
2023  free( P_che ); P_che = NULL;
2024  }
2025  printf(/*Msg,*/ "O.k.\n" );
2026 }
2027 
2028 /********************************************************************/
2029 /* copied from cti_ichnew.c */
2030 /********************************************************************/
2031 float che_poradi (int typ_reakce, double max, double K)
2032 {
2033  if (typ_reakce==4)
2034  {
2035  return 1.9 - K/max/2.0;
2036  }
2037  else // tj. 0,1,3
2038  {
2039  return (float) typ_reakce;
2040  }
2041 }