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