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