9 #define VERZE "30-09-2005"
10 #define vystupni_soubor "che_out.txt"
11 #define PUL_POCTU_VNORENI 8
12 #define MAX_POC_VNEJ_CYK 1500
13 #define MAX_STAGNACE 400
14 #define MAX_POC_VNITR_CYK 2000
15 #define DROBNY_POSUN 1.0e-10
30 fw = fopen(soubor,
"a");
32 fprintf (fw,
"\nmolalita rozpustene %d. latky: %f", i, P_lat[i].m);
42 fw = fopen(soubor,
"a");
44 fprintf (fw,
"\t%f", P_lat[i].m);
54 fprintf(fw,
"\n..............................................................");
56 fprintf (fw,
"\npocatecni molalita rozpustene %d. latky: %f", i, P_lat[i].m0);
64 fprintf (fw,
"\t%f", P_lat[i].m0);
69 int che_Gauss (
double *matice,
double *prstrana,
int *hprvky,
int rozmer )
75 double velprvku = 0.0;
85 printf(
"prusvih Newtona: nulova derivace, prava strana = %f !\n", prstrana[0]);
86 if ( prstrana[0] == 0.0)
88 prstrana[0] = 1.0e-10;
99 prstrana[0]/=matice[0];
104 for ( i=0; i<rozmer; ++i )
110 for ( j=0; j<rozmer; ++j )
114 for ( k=0; k<i; ++k )
116 if (hprvky[k]==j)
break;
119 if ((k==i) && (fabs(matice[j*rozmer+i])>fabs(velprvku)))
122 velprvku = matice[j*rozmer+i];
128 printf(
"Prusvih v %d. sloupci\n", i);
129 for ( j=0; j<rozmer; ++j )
133 for ( k=0; k<i; ++k )
135 if (hprvky[k]==j)
break;
140 matice[j*rozmer+i]=1.0e-9;
142 velprvku = matice[j*rozmer+i];
149 matice[prvek*rozmer+i] = 1.0;
150 for ( j=i+1; j<rozmer; ++j ) matice[prvek*rozmer+j]/=velprvku;
151 prstrana[prvek]/=velprvku;
153 for ( j=0; j<rozmer; ++j )
155 for ( k=0; k<=i; ++k )
157 if (hprvky[k]==j)
break;
161 for ( k=i+1; k<rozmer; ++k ) matice[j*rozmer+k]-=matice[j*rozmer+i]*matice[prvek*rozmer+k];
162 prstrana[j]-=matice[j*rozmer+i]*prstrana[prvek];
163 matice[j*rozmer+i]=0.0;
168 for ( i=rozmer-1; i>=0; --i )
170 for ( j=0; j<rozmer; ++j )
172 for ( k=i; k<rozmer; ++k )
174 if (hprvky[k]==j)
break;
178 prstrana[j]-=matice[j*rozmer+i]*prstrana[hprvky[i]];
179 matice[j*rozmer+i]=0.0;
198 if (b==0)
return 1.0;
207 printf (
"chyba pri mocneni %f**%d !\n", A, b);
239 printf (
"chyba pri mocneni %f**%f !\n", A, b);
248 printf (
"chyba pri mocneni %f**%f !\n", A, b);
260 return exp(log(A)*b);
278 double che_m_x (
int latka,
double *zeta,
double krat)
291 double che_m (
int latka,
double *zeta)
310 vystup +=
che_m(i, zeta)*P_lat[i].
Q*P_lat[i].
Q;
339 printf (
"che_I(zeta)=%f!\n",
che_I(zeta));
342 sqrtlI = sqrt(fabs(
che_I(zeta)));
344 vystup = exp(vystup);
350 double che_dgama_ (
int i,
double *zeta,
int smer,
int *error)
364 printf (
"che_I(zeta)=%f!\n",
che_I(zeta));
368 sqrtlI = sqrt(fabs(
che_I(zeta)));
371 printf(
"sqrtlI = 0.0, posouvam ve smeru: ");
374 sqrtlI = sqrt(fabs(
che_I(zeta)));
376 printf(
"sqrtlI = %f\n", sqrtlI);
379 printf (
"che_I(zeta)=%f, posouvam proti smeru: ",
che_I(zeta));
381 sqrtlI = sqrt(fabs(
che_I(zeta)));
383 printf(
"sqrtlI = %f\n", sqrtlI);
387 vystup = exp(vystup);
392 printf(
"sqrtlI = 0.0: ");
394 printf(
"vystup = %f\n", vystup);
406 double che_K1_(
double *zeta,
int rce,
int vnoreni)
415 printf(
"k1 se moc spatne pocita, koncim!");
440 printf(
"k1 se spatne pocita, posouvam ve smeru: ");
445 printf(
"k1 se spatne pocita, posouvam poprve proti smeru: ");
450 printf(
"k1 se spatne pocita, posouvam proti smeru: ");
453 k1 =
che_K1_(zeta, rce, vnoreni+1);
487 printf(
"k1 se spatne pocita, posouvam ve smeru: ");
492 printf(
"k1 se spatne pocita, posouvam poprve proti smeru: ");
497 printf(
"k1 se spatne pocita, posouvam proti smeru: ");
500 k1 =
che_K1_(zeta, rce, vnoreni+1);
509 double che_K2_(
double *zeta,
int rce,
int vnoreni)
519 printf(
"k2 se moc spatne pocita, koncim!");
534 printf(
"Zaporna iontova sila - ");
543 printf(
"k2 se spatne pocita, posouvam ve smeru: ");
548 printf(
"k2 se spatne pocita, posouvam poprve proti smeru: ");
553 printf(
"k2 se spatne pocita, posouvam proti smeru: ");
556 k2 =
che_K2_(zeta, rce, vnoreni+1);
614 printf(
"K se moc spatne pocita, koncim!");
626 if (P_che[rce].
K>0.0)
641 printf(
"K se moc spatne pocita, koncim!");
650 double che_dK1_(
double *zeta,
int rce,
int smer,
int vnoreni)
661 printf(
"dk1 se moc spatne pocita, koncim!");
688 printf(
"dk1 se spatne pocita, posouvam ve smeru: ");
693 printf(
"dk1 se spatne pocita, posouvam poprve proti smeru: ");
698 printf(
"dk1 se spatne pocita, posouvam proti smeru: ");
701 dk1 =
che_dK1_(zeta, rce, smer, vnoreni+1);
721 printf(
"dk1 se spatne pocita, posouvam ve smeru: ");
726 printf(
"dk1 se spatne pocita, posouvam poprve proti smeru: ");
731 printf(
"dk1 se spatne pocita, posouvam proti smeru: ");
734 dk1 =
che_dK1_(zeta, rce, smer, vnoreni+1);
749 printf(
"dk1 se spatne pocita, posouvam ve smeru: ");
754 printf(
"dk1 se spatne pocita, posouvam poprve proti smeru: ");
759 printf(
"dk1 se spatne pocita, posouvam proti smeru: ");
762 dk1 =
che_dK1_(zeta, rce, smer, vnoreni+1);
771 dk1 += zeta[rce]*pomm;
792 printf(
"dk1 se spatne pocita, posouvam ve smeru: ");
797 printf(
"dk1 se spatne pocita, posouvam poprve proti smeru: ");
802 printf(
"dk1 se spatne pocita, posouvam proti smeru: ");
805 dk1 =
che_dK1_(zeta, rce, smer, vnoreni+1);
820 printf(
"dk1 se spatne pocita, posouvam ve smeru: ");
825 printf(
"dk1 se spatne pocita, posouvam poprve proti smeru: ");
830 printf(
"dk1 se spatne pocita, posouvam proti smeru: ");
833 dk1 =
che_dK1_(zeta, rce, smer, vnoreni+1);
848 double che_dK2_(
double *zeta,
int rce,
int smer,
int vnoreni)
861 printf(
"dk2 se moc spatne pocita, koncim!");
878 printf(
"Zaporna iontova sila - ");
887 printf(
"dk2 se spatne pocita, posouvam ve smeru: ");
892 printf(
"dk2 se spatne pocita, posouvam poprve proti smeru: ");
897 printf(
"dk2 se spatne pocita, posouvam proti smeru: ");
900 dk2 =
che_dK2_(zeta, rce, smer, vnoreni+1);
909 if ((chybicka + chybicka2) > 0)
912 printf(
"Zaporna iontova sila - ");
921 printf(
"dk2 se spatne pocita, posouvam ve smeru: ");
926 printf(
"dk2 se spatne pocita, posouvam poprve proti smeru: ");
931 printf(
"dk2 se spatne pocita, posouvam proti smeru: ");
934 dk2 =
che_dK2_(zeta, rce, smer, vnoreni+1);
949 if (
G_prm.
vypisy>4) printf(
"o.k. (che_hodnota_)");
959 vystup =
che_K1_(zeta,rce,0)*
che_dK2_(zeta,rce,smer,0)+
che_K2_(zeta,rce,0)*
che_dK1_(zeta,rce,smer,0);
960 if (
G_prm.
vypisy>4) printf(
"o.k. (che_derivace_)");
1011 vysl+=x[i]*x[i]/K[i]/K[i];
1027 fprintf (fw,
"\n> norma = %f", norma);
1050 for (i=0;i<delka;i++)
1054 if (
G_prm.
vypisy>4) printf(
"o.k. (che_nasob_ld)");
1057 void che_kombinuj4_ld (
double x1,
double *y1,
double x2,
double *y2,
double x3,
double *y3,
double x4,
double *y4,
double *z,
int delka)
1061 if (
G_prm.
vypisy>4) printf(
"\nche_kombinuj4_ld: ");
1062 for (i=0;i<delka;i++)
1064 z[i]=x1*y1[i]+x2*y2[i]+x3*y3[i]+x4*y4[i];
1066 if (
G_prm.
vypisy>4) printf(
"o.k. (che_kombinuj4_ld)");
1074 for (i=0;i<delka;i++)
1078 if (
G_prm.
vypisy>4) printf(
"o.k. (che_nuluj_ld)");
1099 vysl[ij]=prstrana[hprvky[ij]];
1107 for (i=0;i<delka;i++)
1109 fprintf(fw,
"%f",vektor[i]);
1124 fw = fopen(soubor,
"a");
1132 fprintf (fw,
"| %f", prstr[i]);
1146 if (
G_prm.
vypisy>4) printf(
"\nche_odecti_s_korekci_ld:");
1149 if (
che_m(i,x) < 0.0)
1151 printf (
"m(%d,...)=%f je zaporne!\n",i,
che_m(i,x));
1156 printf (
"m(%d,...)=%f je nulove!\n",i,
che_m(i,x));
1159 z0 = (
double *)malloc( delka*
sizeof(
double ));
1162 printf (
"Malo pameti!\n");
1164 }
for(j = 0; j < delka; j++){ z0[j] = 0.0; }
1180 fprintf(fw,
"\n %d. VNITRNI CYKLUS", pruchodu);
1185 fprintf(fw,
"\nz0=");
1191 fprintf(fw,
"\nmolality:");
1194 fprintf(fw,
"\t%f",
che_m(i,z0));
1202 if (
che_m(i,z0) < 0.0)
1207 fprintf(fw,
"\nproblem: m(%d)=%f",i,
che_m(i,z0));
1219 while (problem > 0);
1221 if (
G_prm.
vypisy>4) printf(
"O.K.(che_odecti_s_korekci_ld)");
1232 fw = fopen(soubor,
"a");
1233 fprintf (fw,
"\n..zeta=");
1235 fprintf (fw,
"\n.....K=");
1237 fprintf (fw,
"\n.....J=");
1252 skala[i] = 1.0/KK[i];
1272 P_lat[i].
m0=P_lat[i].
m;
1280 double hodnota = 0.0;
1281 double vysledek = 0.0;
1291 pom =
che_m(i,zeta0);
1320 if (
G_prm.
vypisy>4) printf(
"o.k.(che_osklivost = %f)", vysledek);
1331 double *
zeta0 = NULL;
1332 double *zeta = NULL;
1336 double osklivost0 = 0.0;
1337 double osklivost = 0.0;
1343 if ( zeta0 == NULL )
1345 printf (
"Malo pameti!\n");
1352 printf (
"Malo pameti!\n");
1359 osklivost0=
che_osklivost(zeta0, &zapornych0, &nulovych0, &nejhorsi0);
1360 if (osklivost0 <= 1.0)
1362 if (osklivost0 != 0.0)
1377 case 0: zeta[j] =0.0;
break;
1382 osklivost=
che_osklivost (zeta, &zapornych0, &nulovych0, &nejhorsi0);
1383 if (osklivost < osklivost0)
1385 osklivost0 = osklivost;
1391 if (osklivost == 0.0)
break;
1401 P_che[i].
zeta0 = zeta0[i];
1405 printf(
"\nzeta0 se nepodarilo nastavit (osklivost je 1.0+(%f))", osklivost0-1.0);
1420 double *zeta = NULL;
1422 double *skala = NULL;
1424 double *hodnota = NULL;
1426 double *delta = NULL;
1427 double *prstr = NULL;
1430 double stara_norma = 0.0;
1437 P_lat[i].
m = P_lat[i].
m0;
1445 P_lat[i].
m = P_lat[i].
m0;
1447 fw = fopen(soubor,
"a");
1448 fprintf (fw,
"\nchemie: URCITE NEKOREKTNI POCATECNI PODMINKA!\t");
1455 printf (
"Malo pameti!\n");
1460 if ( prstr == NULL )
1462 printf (
"Malo pameti!\n");
1467 if ( delta == NULL )
1469 printf (
"Malo pameti!\n");
1476 printf (
"Malo pameti!\n");
1481 if ( skala == NULL )
1483 printf (
"Malo pameti!\n");
1490 printf (
"Malo pameti!\n");
1495 if ( hodnota == NULL )
1497 printf (
"Malo pameti!\n");
1501 if ( hprvky == NULL )
1503 printf (
"Malo pameti!\n");
1509 zeta[i]=P_che[i].
zeta0;
1514 fw = fopen(soubor,
"a");
1515 fprintf (fw,
"\nK -> ");
1534 if (norma>stara_norma)
1539 fw = fopen(soubor,
"a");
1540 fprintf(fw,
"\n ( - omega = %f )",
G_prm.
omega);
1543 stara_norma = norma;
1546 else if (norma*1.5 < stara_norma)
1559 fw = fopen(soubor,
"a");
1560 fprintf(fw,
"\n ( + omega = %f )",
G_prm.
omega);
1563 stara_norma = norma;
1572 fw = fopen(soubor,
"a");
1573 fprintf(fw,
"\n%d. VNEJSI CYKLUS", pruchodu);
1577 fw = fopen(soubor,
"a");
1578 fprintf(fw,
"\nmolality:");
1581 fprintf(fw,
"\t%f",
che_m(i,zeta));
1588 fw = fopen(soubor,
"a");
1589 fprintf (fw,
"\nchemie: Gauss spadnul!");
1596 fw = fopen(soubor,
"a");
1597 fprintf (fw,
"\n> delta=");
1604 fw = fopen(soubor,
"a");
1605 fprintf (fw,
"\nchemie: PATRNE NEKOREKTNI POCATECNI PODMINKA!\t");
1620 fw = fopen(soubor,
"a");
1621 fprintf (fw,
"\nchemie: NEMOHU DODRZET POZADOVANOU PRESNOST!\n");
1626 fw = fopen(soubor,
"a");
1627 fprintf (fw,
"\nchemie: PATRNE PRILIS RYCHLE KINETICKE REAKCE!\t");
1633 P_lat[i].
m =
che_m(i,zeta);
1699 poloha2[j] = poloha[j]+posunuti[j];
1708 double maximum = 0.0;
1724 printf(
"\nchemie: Tohle se vubec nemelo stat, nerozumim tomu - nelze uz zkratit spotrebu latky!");
1728 if (maximum>=o_kolik)
1745 double *poloha = NULL;
1746 double *poloha2 = NULL;
1751 double *rychlosti = NULL;
1752 double *posunuti = NULL;
1764 if (
G_prm.
vypisy>4) printf(
"\nche_pomala_kinetika: ");
1769 if ( poloha == NULL )
1771 printf (
"Malo pameti!\n");
1776 if ( poloha2 == NULL )
1778 printf (
"Malo pameti!\n");
1783 if ( rychlosti == NULL )
1785 printf (
"Malo pameti!\n");
1792 printf (
"Malo pameti!\n");
1799 printf (
"Malo pameti!\n");
1806 printf (
"Malo pameti!\n");
1813 printf (
"Malo pameti!\n");
1818 if ( posunuti == NULL )
1820 printf (
"Malo pameti!\n");
1824 for (krok = 0; krok<poc_kroku; krok++)
1828 poloha[j] = P_lat[j].
m0;
1829 if (P_lat[j].m0<0.0)
1831 printf(
"\nchemie: Vstup do pomalych kinetickych reakci obsahoval zapornou molalitu %d. latky-neprobehne vypocet!!", j+1);
1882 printf(
"\nchemie: pri pomalych kinetickych reakcich dosla %d. latka (%f)\t", j+1, poloha2[j]);
1890 P_lat[j].
m0 = poloha2[j];
1891 P_lat[j].
m = poloha2[j];
1892 if (P_lat[j].m0<0.0)
1894 if (P_lat[j].m0>-1.e-20)
1900 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);
1932 if (
G_prm.
vypisy>4) printf(
"o.k. (che_pomala_kinetika)");
1988 printf(
"\n (%d): ", i);
1989 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);
1995 printf(
"\n (%d): ", i);
1997 printf(
"\n stech. koef.: ");
2002 printf(
"\n exponenty: ");
2005 printf(
"%f ", P_che[i].
exponent[j]);
2015 printf(
"Uvolneni che_ P_lat, P_che : " );
2016 if ( P_lat != NULL )
2018 free( P_lat ); P_lat = NULL;
2021 if ( P_che != NULL )
2023 free( P_che ); P_che = NULL;
2035 return 1.9 - K/max/2.0;