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 45 fw = fopen(soubor,
"a");
47 fprintf (fw,
"\nmolalita rozpustene %d. latky: %f", i, P_lat[i].m);
57 fw = fopen(soubor,
"a");
59 fprintf (fw,
"\t%f", P_lat[i].m);
69 fprintf(fw,
"\n..............................................................");
71 fprintf (fw,
"\npocatecni molalita rozpustene %d. latky: %f", i, P_lat[i].m0);
79 fprintf (fw,
"\t%f", P_lat[i].m0);
84 int che_Gauss (
double *matice,
double *prstrana,
int *hprvky,
int rozmer )
90 double velprvku = 0.0;
100 printf(
"prusvih Newtona: nulova derivace, prava strana = %f !\n", prstrana[0]);
101 if ( prstrana[0] == 0.0)
103 prstrana[0] = 1.0e-10;
114 prstrana[0]/=matice[0];
119 for ( i=0; i<rozmer; ++i )
125 for ( j=0; j<rozmer; ++j )
129 for ( k=0; k<i; ++k )
131 if (hprvky[k]==j)
break;
134 if ((k==i) && (fabs(matice[j*rozmer+i])>fabs(velprvku)))
137 velprvku = matice[j*rozmer+i];
143 printf(
"Prusvih v %d. sloupci\n", i);
144 for ( j=0; j<rozmer; ++j )
148 for ( k=0; k<i; ++k )
150 if (hprvky[k]==j)
break;
155 matice[j*rozmer+i]=1.0e-9;
157 velprvku = matice[j*rozmer+i];
164 matice[prvek*rozmer+i] = 1.0;
165 for ( j=i+1; j<rozmer; ++j ) matice[prvek*rozmer+j]/=velprvku;
166 prstrana[prvek]/=velprvku;
168 for ( j=0; j<rozmer; ++j )
170 for ( k=0; k<=i; ++k )
172 if (hprvky[k]==j)
break;
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;
183 for ( i=rozmer-1; i>=0; --i )
185 for ( j=0; j<rozmer; ++j )
187 for ( k=i; k<rozmer; ++k )
189 if (hprvky[k]==j)
break;
193 prstrana[j]-=matice[j*rozmer+i]*prstrana[hprvky[i]];
194 matice[j*rozmer+i]=0.0;
213 if (b==0)
return 1.0;
222 printf (
"chyba pri mocneni %f**%d !\n", A, b);
254 printf (
"chyba pri mocneni %f**%f !\n", A, b);
262 printf (
"chyba pri mocneni %f**%f !\n", A, b);
273 return exp(log(A)*b);
291 double che_m_x (
int latka,
double *zeta,
double krat)
304 double che_m (
int latka,
double *zeta)
323 vystup +=
che_m(i, zeta)*P_lat[i].
Q*P_lat[i].
Q;
355 sqrtlI = sqrt(fabs(
che_I(zeta)));
357 vystup = exp(vystup);
363 double che_dgama_ (
int i,
double *zeta,
int smer,
int *error)
380 sqrtlI = sqrt(fabs(
che_I(zeta)));
383 printf(
"sqrtlI = 0.0, posouvam ve smeru: ");
386 sqrtlI = sqrt(fabs(
che_I(zeta)));
388 printf(
"sqrtlI = %f\n", sqrtlI);
391 printf (
"che_I(zeta)=%f, posouvam proti smeru: ",
che_I(zeta));
393 sqrtlI = sqrt(fabs(
che_I(zeta)));
395 printf(
"sqrtlI = %f\n", sqrtlI);
399 vystup = exp(vystup);
406 printf(
"vystup = %f\n", vystup);
418 double che_K1_(
double *zeta,
int rce,
int vnoreni)
427 printf(
"k1 se moc spatne pocita, koncim!");
452 printf(
"k1 se spatne pocita, posouvam ve smeru: ");
457 printf(
"k1 se spatne pocita, posouvam poprve proti smeru: ");
462 printf(
"k1 se spatne pocita, posouvam proti smeru: ");
465 k1 =
che_K1_(zeta, rce, vnoreni+1);
499 printf(
"k1 se spatne pocita, posouvam ve smeru: ");
504 printf(
"k1 se spatne pocita, posouvam poprve proti smeru: ");
509 printf(
"k1 se spatne pocita, posouvam proti smeru: ");
512 k1 =
che_K1_(zeta, rce, vnoreni+1);
521 double che_K2_(
double *zeta,
int rce,
int vnoreni)
531 printf(
"k2 se moc spatne pocita, koncim!");
546 printf(
"Zaporna iontova sila - ");
555 printf(
"k2 se spatne pocita, posouvam ve smeru: ");
560 printf(
"k2 se spatne pocita, posouvam poprve proti smeru: ");
565 printf(
"k2 se spatne pocita, posouvam proti smeru: ");
568 k2 =
che_K2_(zeta, rce, vnoreni+1);
626 printf(
"K se moc spatne pocita, koncim!");
638 if (P_che[rce].
K>0.0)
653 printf(
"K se moc spatne pocita, koncim!");
662 double che_dK1_(
double *zeta,
int rce,
int smer,
int vnoreni)
673 printf(
"dk1 se moc spatne pocita, koncim!");
700 printf(
"dk1 se spatne pocita, posouvam ve smeru: ");
705 printf(
"dk1 se spatne pocita, posouvam poprve proti smeru: ");
710 printf(
"dk1 se spatne pocita, posouvam proti smeru: ");
713 dk1 =
che_dK1_(zeta, rce, smer, vnoreni+1);
733 printf(
"dk1 se spatne pocita, posouvam ve smeru: ");
738 printf(
"dk1 se spatne pocita, posouvam poprve proti smeru: ");
743 printf(
"dk1 se spatne pocita, posouvam proti smeru: ");
746 dk1 =
che_dK1_(zeta, rce, smer, vnoreni+1);
761 printf(
"dk1 se spatne pocita, posouvam ve smeru: ");
766 printf(
"dk1 se spatne pocita, posouvam poprve proti smeru: ");
771 printf(
"dk1 se spatne pocita, posouvam proti smeru: ");
774 dk1 =
che_dK1_(zeta, rce, smer, vnoreni+1);
783 dk1 += zeta[rce]*pomm;
804 printf(
"dk1 se spatne pocita, posouvam ve smeru: ");
809 printf(
"dk1 se spatne pocita, posouvam poprve proti smeru: ");
814 printf(
"dk1 se spatne pocita, posouvam proti smeru: ");
817 dk1 =
che_dK1_(zeta, rce, smer, vnoreni+1);
832 printf(
"dk1 se spatne pocita, posouvam ve smeru: ");
837 printf(
"dk1 se spatne pocita, posouvam poprve proti smeru: ");
842 printf(
"dk1 se spatne pocita, posouvam proti smeru: ");
845 dk1 =
che_dK1_(zeta, rce, smer, vnoreni+1);
860 double che_dK2_(
double *zeta,
int rce,
int smer,
int vnoreni)
873 printf(
"dk2 se moc spatne pocita, koncim!");
890 printf(
"Zaporna iontova sila - ");
899 printf(
"dk2 se spatne pocita, posouvam ve smeru: ");
904 printf(
"dk2 se spatne pocita, posouvam poprve proti smeru: ");
909 printf(
"dk2 se spatne pocita, posouvam proti smeru: ");
912 dk2 =
che_dK2_(zeta, rce, smer, vnoreni+1);
921 if ((chybicka + chybicka2) > 0)
924 printf(
"Zaporna iontova sila - ");
933 printf(
"dk2 se spatne pocita, posouvam ve smeru: ");
938 printf(
"dk2 se spatne pocita, posouvam poprve proti smeru: ");
943 printf(
"dk2 se spatne pocita, posouvam proti smeru: ");
946 dk2 =
che_dK2_(zeta, rce, smer, vnoreni+1);
971 vystup =
che_K1_(zeta,rce,0)*
che_dK2_(zeta,rce,smer,0)+
che_K2_(zeta,rce,0)*
che_dK1_(zeta,rce,smer,0);
1023 vysl+=x[i]*x[i]/K[i]/K[i];
1039 fprintf (fw,
"\n> norma = %f", norma);
1062 for (i=0;i<delka;i++)
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)
1074 for (i=0;i<delka;i++)
1076 z[i]=x1*y1[i]+x2*y2[i]+x3*y3[i]+x4*y4[i];
1086 for (i=0;i<delka;i++)
1111 vysl[ij]=prstrana[hprvky[ij]];
1119 for (i=0;i<delka;i++)
1136 fw = fopen(soubor,
"a");
1144 fprintf (fw,
"| %f", prstr[i]);
1161 if (
che_m(i,x) < 0.0)
1163 printf (
"m(%d,...)=%f je zaporne!\n",i,
che_m(i,x));
1168 printf (
"m(%d,...)=%f je nulove!\n",i,
che_m(i,x));
1171 z0 = (
double *)malloc( delka*
sizeof(
double ));
1174 printf (
"Malo pameti!\n");
1176 }
for(j = 0; j < delka; j++){ z0[j] = 0.0; }
1192 fprintf(fw,
"\n %d. VNITRNI CYKLUS", pruchodu);
1214 if (
che_m(i,z0) < 0.0)
1231 while (problem > 0);
1244 fw = fopen(soubor,
"a");
1264 skala[i] = 1.0/KK[i];
1284 P_lat[i].
m0=P_lat[i].
m;
1292 double hodnota = 0.0;
1293 double vysledek = 0.0;
1303 pom =
che_m(i,zeta0);
1343 double *
zeta0 = NULL;
1344 double *zeta = NULL;
1348 double osklivost0 = 0.0;
1349 double osklivost = 0.0;
1355 if ( zeta0 == NULL )
1357 printf (
"Malo pameti!\n");
1364 printf (
"Malo pameti!\n");
1371 osklivost0=
che_osklivost(zeta0, &zapornych0, &nulovych0, &nejhorsi0);
1372 if (osklivost0 <= 1.0)
1374 if (osklivost0 != 0.0)
1389 case 0: zeta[j] =0.0;
break;
1394 osklivost=
che_osklivost (zeta, &zapornych0, &nulovych0, &nejhorsi0);
1395 if (osklivost < osklivost0)
1397 osklivost0 = osklivost;
1403 if (osklivost == 0.0)
break;
1413 P_che[i].
zeta0 = zeta0[i];
1417 printf(
"\nzeta0 se nepodarilo nastavit (osklivost je 1.0+(%f))", osklivost0-1.0);
1432 double *zeta = NULL;
1434 double *skala = NULL;
1436 double *hodnota = NULL;
1438 double *delta = NULL;
1439 double *prstr = NULL;
1442 double stara_norma = 0.0;
1449 P_lat[i].
m = P_lat[i].
m0;
1457 P_lat[i].
m = P_lat[i].
m0;
1459 fw = fopen(soubor,
"a");
1460 fprintf (fw,
"\nchemie: URCITE NEKOREKTNI POCATECNI PODMINKA!\t");
1467 printf (
"Malo pameti!\n");
1472 if ( prstr == NULL )
1474 printf (
"Malo pameti!\n");
1479 if ( delta == NULL )
1481 printf (
"Malo pameti!\n");
1488 printf (
"Malo pameti!\n");
1493 if ( skala == NULL )
1495 printf (
"Malo pameti!\n");
1502 printf (
"Malo pameti!\n");
1507 if ( hodnota == NULL )
1509 printf (
"Malo pameti!\n");
1513 if ( hprvky == NULL )
1515 printf (
"Malo pameti!\n");
1521 zeta[i]=P_che[i].
zeta0;
1526 fw = fopen(soubor,
"a");
1546 if (norma>stara_norma)
1551 fw = fopen(soubor,
"a");
1555 stara_norma = norma;
1558 else if (norma*1.5 < stara_norma)
1571 fw = fopen(soubor,
"a");
1575 stara_norma = norma;
1584 fw = fopen(soubor,
"a");
1585 fprintf(fw,
"\n%d. VNEJSI CYKLUS", pruchodu);
1589 fw = fopen(soubor,
"a");
1600 fw = fopen(soubor,
"a");
1601 fprintf (fw,
"\nchemie: Gauss spadnul!");
1608 fw = fopen(soubor,
"a");
1616 fw = fopen(soubor,
"a");
1617 fprintf (fw,
"\nchemie: PATRNE NEKOREKTNI POCATECNI PODMINKA!\t");
1632 fw = fopen(soubor,
"a");
1633 fprintf (fw,
"\nchemie: NEMOHU DODRZET POZADOVANOU PRESNOST!\n");
1638 fw = fopen(soubor,
"a");
1639 fprintf (fw,
"\nchemie: PATRNE PRILIS RYCHLE KINETICKE REAKCE!\t");
1645 P_lat[i].
m =
che_m(i,zeta);
1711 poloha2[j] = poloha[j]+posunuti[j];
1720 double maximum = 0.0;
1736 printf(
"\nchemie: Tohle se vubec nemelo stat, nerozumim tomu - nelze uz zkratit spotrebu latky!");
1739 if (maximum>=o_kolik)
1756 double *poloha = NULL;
1757 double *poloha2 = NULL;
1762 double *rychlosti = NULL;
1763 double *posunuti = NULL;
1780 if ( poloha == NULL )
1782 printf (
"Malo pameti!\n");
1787 if ( poloha2 == NULL )
1789 printf (
"Malo pameti!\n");
1794 if ( rychlosti == NULL )
1796 printf (
"Malo pameti!\n");
1803 printf (
"Malo pameti!\n");
1810 printf (
"Malo pameti!\n");
1817 printf (
"Malo pameti!\n");
1824 printf (
"Malo pameti!\n");
1829 if ( posunuti == NULL )
1831 printf (
"Malo pameti!\n");
1835 for (krok = 0; krok<poc_kroku; krok++)
1839 poloha[j] = P_lat[j].
m0;
1840 if (P_lat[j].m0<0.0)
1842 printf(
"\nchemie: Vstup do pomalych kinetickych reakci obsahoval zapornou molalitu %d. latky-neprobehne vypocet!!", j+1);
1893 printf(
"\nchemie: pri pomalych kinetickych reakcich dosla %d. latka (%f)\t", j+1, poloha2[j]);
1901 P_lat[j].
m0 = poloha2[j];
1902 P_lat[j].
m = poloha2[j];
1903 if (P_lat[j].m0<0.0)
1905 if (P_lat[j].m0>-1.e-20)
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);
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);
2006 printf(
"\n stech. koef.: ");
2011 printf(
"\n exponenty: ");
2024 printf(
"Uvolneni che_ P_lat, P_che : " );
2025 if ( P_lat != NULL )
2027 free( P_lat ); P_lat = NULL;
2030 if ( P_che != NULL )
2032 free( P_che ); P_che = NULL;
2044 return 1.9 - K/max/2.0;
double che_poww(double A, int b, int *error)
void che_uvolneni_P(void)
void che_nuluj_ld(double *z, int delka)
void che_odecti(double *x, double *y, double *z)
void che_vypis_soubor(char *soubor)
void che_nasob_ld(double x, double *y, double *z, int delka)
double che_derivace_(double *zeta, int rce, int smer)
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)
double che_poww_ld(double A, double b, int *error)
double che_gama_(int i, double *zeta, int *error)
double che_dgama_(int i, double *zeta, int smer, int *error)
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)
void che_maticovy_vypocet(char *soubor)
void che_pocitej_soubor(char *soubor, int *poc_krok)
double che_m(int latka, double *zeta)
int pocet_reakci_pro_matici
void che_spocitej_posunuti(double *posunuti, double *rychlosti)
double che_m_(int latka, double *zeta)
double che_rel_norma(double *x, double *K)
void che_outpocp_soubor(FILE *fw)
double che_dK2_(double *zeta, int rce, int smer, int vnoreni)
void che_zgaussproprg(double *prstrana, int *hprvky, double *vysl)
void che_spocitej_rychlosti(double *rychlosti, double *poloha, double dt)
void che_prepocitej_polohu(double *poloha2, double *poloha, double *posunuti)
double che_m_x(int latka, double *zeta, double krat)
void che_vypis_prm_lat_che(void)
FMT_FUNC int fprintf(std::ostream &os, CStringRef format, ArgList args)
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)
int che_odecti_s_korekci_ld(double *x, double *y, double *z, int delka)
double exponent[MAX_POC_LATEK]
double che_osklivost(double *zeta0, int *zapornych, int *nulovych, int *nejhorsi)
void che_matice_se_sorpci(char *soubor)
#define PUL_POCTU_VNORENI
double che_I(double *zeta)
void che_nactenichemie(void)
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)
double che_K2_(double *zeta, int rce, int vnoreni)
void che_kopiruj(double *y, double *z)
void che_outpocp__soubor(FILE *fw)
double che_norma(double *x, double *K)
void che_vypocet_rovnovah(char *soubor)
void che_hodnoty(double *zeta, double *hodnota, double *skala)
double che_lnKT0(int rce)
double che_hodnota_(double *zeta, int rce)
#define MAX_POC_VNITR_CYK
double che_K1_(double *zeta, int rce, int vnoreni)
void che_napis_soubor_ld(FILE *fw, double *vektor, int delka)
void che_vypis__soubor(char *soubor)
void che_srovnej(double *KK, double *skala)
int stech_koef_p[MAX_POC_LATEK]
void printf(BasicWriter< Char > &w, BasicCStringRef< Char > format, ArgList args)
double che_dK1_(double *zeta, int rce, int smer, int vnoreni)