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
28 fw = fopen(soubor,
"a");
30 fprintf (fw,
"\nmolalita rozpustene %d. latky: %f", i, P_lat[i].m);
40 fw = fopen(soubor,
"a");
42 fprintf (fw,
"\t%f", P_lat[i].m);
52 fprintf(fw,
"\n..............................................................");
54 fprintf (fw,
"\npocatecni molalita rozpustene %d. latky: %f", i, P_lat[i].m0);
62 fprintf (fw,
"\t%f", P_lat[i].m0);
67 int che_Gauss (
double *matice,
double *prstrana,
int *hprvky,
int rozmer )
73 double velprvku = 0.0;
83 printf(
"prusvih Newtona: nulova derivace, prava strana = %f !\n", prstrana[0]);
84 if ( prstrana[0] == 0.0)
86 prstrana[0] = 1.0e-10;
97 prstrana[0]/=matice[0];
102 for ( i=0; i<rozmer; ++i )
108 for ( j=0; j<rozmer; ++j )
112 for ( k=0; k<i; ++k )
114 if (hprvky[k]==j)
break;
117 if ((k==i) && (fabs(matice[j*rozmer+i])>fabs(velprvku)))
120 velprvku = matice[j*rozmer+i];
126 printf(
"Prusvih v %d. sloupci\n", i);
127 for ( j=0; j<rozmer; ++j )
131 for ( k=0; k<i; ++k )
133 if (hprvky[k]==j)
break;
138 matice[j*rozmer+i]=1.0e-9;
140 velprvku = matice[j*rozmer+i];
147 matice[prvek*rozmer+i] = 1.0;
148 for ( j=i+1; j<rozmer; ++j ) matice[prvek*rozmer+j]/=velprvku;
149 prstrana[prvek]/=velprvku;
151 for ( j=0; j<rozmer; ++j )
153 for ( k=0; k<=i; ++k )
155 if (hprvky[k]==j)
break;
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;
166 for ( i=rozmer-1; i>=0; --i )
168 for ( j=0; j<rozmer; ++j )
170 for ( k=i; k<rozmer; ++k )
172 if (hprvky[k]==j)
break;
176 prstrana[j]-=matice[j*rozmer+i]*prstrana[hprvky[i]];
177 matice[j*rozmer+i]=0.0;
196 if (b==0)
return 1.0;
205 printf (
"chyba pri mocneni %f**%d !\n", A, b);
237 printf (
"chyba pri mocneni %f**%f !\n", A, b);
245 printf (
"chyba pri mocneni %f**%f !\n", A, b);
256 return exp(log(A)*b);
274 double che_m_x (
int latka,
double *zeta,
double krat)
287 double che_m (
int latka,
double *zeta)
306 vystup +=
che_m(i, zeta)*P_lat[i].
Q*P_lat[i].
Q;
335 printf (
"che_I(zeta)=%f!\n",
che_I(zeta));
338 sqrtlI = sqrt(fabs(
che_I(zeta)));
340 vystup = exp(vystup);
346 double che_dgama_ (
int i,
double *zeta,
int smer,
int *error)
360 printf (
"che_I(zeta)=%f!\n",
che_I(zeta));
363 sqrtlI = sqrt(fabs(
che_I(zeta)));
366 printf(
"sqrtlI = 0.0, posouvam ve smeru: ");
369 sqrtlI = sqrt(fabs(
che_I(zeta)));
371 printf(
"sqrtlI = %f\n", sqrtlI);
374 printf (
"che_I(zeta)=%f, posouvam proti smeru: ",
che_I(zeta));
376 sqrtlI = sqrt(fabs(
che_I(zeta)));
378 printf(
"sqrtlI = %f\n", sqrtlI);
382 vystup = exp(vystup);
387 printf(
"sqrtlI = 0.0: ");
389 printf(
"vystup = %f\n", vystup);
401 double che_K1_(
double *zeta,
int rce,
int vnoreni)
410 printf(
"k1 se moc spatne pocita, koncim!");
435 printf(
"k1 se spatne pocita, posouvam ve smeru: ");
440 printf(
"k1 se spatne pocita, posouvam poprve proti smeru: ");
445 printf(
"k1 se spatne pocita, posouvam proti smeru: ");
448 k1 =
che_K1_(zeta, rce, vnoreni+1);
482 printf(
"k1 se spatne pocita, posouvam ve smeru: ");
487 printf(
"k1 se spatne pocita, posouvam poprve proti smeru: ");
492 printf(
"k1 se spatne pocita, posouvam proti smeru: ");
495 k1 =
che_K1_(zeta, rce, vnoreni+1);
504 double che_K2_(
double *zeta,
int rce,
int vnoreni)
514 printf(
"k2 se moc spatne pocita, koncim!");
529 printf(
"Zaporna iontova sila - ");
538 printf(
"k2 se spatne pocita, posouvam ve smeru: ");
543 printf(
"k2 se spatne pocita, posouvam poprve proti smeru: ");
548 printf(
"k2 se spatne pocita, posouvam proti smeru: ");
551 k2 =
che_K2_(zeta, rce, vnoreni+1);
609 printf(
"K se moc spatne pocita, koncim!");
621 if (P_che[rce].
K>0.0)
636 printf(
"K se moc spatne pocita, koncim!");
645 double che_dK1_(
double *zeta,
int rce,
int smer,
int vnoreni)
656 printf(
"dk1 se moc spatne pocita, koncim!");
683 printf(
"dk1 se spatne pocita, posouvam ve smeru: ");
688 printf(
"dk1 se spatne pocita, posouvam poprve proti smeru: ");
693 printf(
"dk1 se spatne pocita, posouvam proti smeru: ");
696 dk1 =
che_dK1_(zeta, rce, smer, vnoreni+1);
716 printf(
"dk1 se spatne pocita, posouvam ve smeru: ");
721 printf(
"dk1 se spatne pocita, posouvam poprve proti smeru: ");
726 printf(
"dk1 se spatne pocita, posouvam proti smeru: ");
729 dk1 =
che_dK1_(zeta, rce, smer, vnoreni+1);
744 printf(
"dk1 se spatne pocita, posouvam ve smeru: ");
749 printf(
"dk1 se spatne pocita, posouvam poprve proti smeru: ");
754 printf(
"dk1 se spatne pocita, posouvam proti smeru: ");
757 dk1 =
che_dK1_(zeta, rce, smer, vnoreni+1);
766 dk1 += zeta[rce]*pomm;
787 printf(
"dk1 se spatne pocita, posouvam ve smeru: ");
792 printf(
"dk1 se spatne pocita, posouvam poprve proti smeru: ");
797 printf(
"dk1 se spatne pocita, posouvam proti smeru: ");
800 dk1 =
che_dK1_(zeta, rce, smer, vnoreni+1);
815 printf(
"dk1 se spatne pocita, posouvam ve smeru: ");
820 printf(
"dk1 se spatne pocita, posouvam poprve proti smeru: ");
825 printf(
"dk1 se spatne pocita, posouvam proti smeru: ");
828 dk1 =
che_dK1_(zeta, rce, smer, vnoreni+1);
843 double che_dK2_(
double *zeta,
int rce,
int smer,
int vnoreni)
856 printf(
"dk2 se moc spatne pocita, koncim!");
873 printf(
"Zaporna iontova sila - ");
882 printf(
"dk2 se spatne pocita, posouvam ve smeru: ");
887 printf(
"dk2 se spatne pocita, posouvam poprve proti smeru: ");
892 printf(
"dk2 se spatne pocita, posouvam proti smeru: ");
895 dk2 =
che_dK2_(zeta, rce, smer, vnoreni+1);
904 if ((chybicka + chybicka2) > 0)
907 printf(
"Zaporna iontova sila - ");
916 printf(
"dk2 se spatne pocita, posouvam ve smeru: ");
921 printf(
"dk2 se spatne pocita, posouvam poprve proti smeru: ");
926 printf(
"dk2 se spatne pocita, posouvam proti smeru: ");
929 dk2 =
che_dK2_(zeta, rce, smer, vnoreni+1);
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_)");
1006 vysl+=x[i]*x[i]/K[i]/K[i];
1022 fprintf (fw,
"\n> norma = %f", norma);
1045 for (i=0;i<delka;i++)
1049 if (
G_prm.
vypisy>4) printf(
"o.k. (che_nasob_ld)");
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)
1056 if (
G_prm.
vypisy>4) printf(
"\nche_kombinuj4_ld: ");
1057 for (i=0;i<delka;i++)
1059 z[i]=x1*y1[i]+x2*y2[i]+x3*y3[i]+x4*y4[i];
1061 if (
G_prm.
vypisy>4) printf(
"o.k. (che_kombinuj4_ld)");
1069 for (i=0;i<delka;i++)
1073 if (
G_prm.
vypisy>4) printf(
"o.k. (che_nuluj_ld)");
1094 vysl[ij]=prstrana[hprvky[ij]];
1102 for (i=0;i<delka;i++)
1104 fprintf(fw,
"%f",vektor[i]);
1119 fw = fopen(soubor,
"a");
1127 fprintf (fw,
"| %f", prstr[i]);
1141 if (
G_prm.
vypisy>4) printf(
"\nche_odecti_s_korekci_ld:");
1144 if (
che_m(i,x) < 0.0)
1146 printf (
"m(%d,...)=%f je zaporne!\n",i,
che_m(i,x));
1151 printf (
"m(%d,...)=%f je nulove!\n",i,
che_m(i,x));
1154 z0 = (
double *)malloc( delka*
sizeof(
double ));
1157 printf (
"Malo pameti!\n");
1159 }
for(j = 0; j < delka; j++){ z0[j] = 0.0; }
1175 fprintf(fw,
"\n %d. VNITRNI CYKLUS", pruchodu);
1180 fprintf(fw,
"\nz0=");
1186 fprintf(fw,
"\nmolality:");
1189 fprintf(fw,
"\t%f",
che_m(i,z0));
1197 if (
che_m(i,z0) < 0.0)
1202 fprintf(fw,
"\nproblem: m(%d)=%f",i,
che_m(i,z0));
1214 while (problem > 0);
1216 if (
G_prm.
vypisy>4) printf(
"O.K.(che_odecti_s_korekci_ld)");
1227 fw = fopen(soubor,
"a");
1228 fprintf (fw,
"\n..zeta=");
1230 fprintf (fw,
"\n.....K=");
1232 fprintf (fw,
"\n.....J=");
1247 skala[i] = 1.0/KK[i];
1267 P_lat[i].
m0=P_lat[i].
m;
1275 double hodnota = 0.0;
1276 double vysledek = 0.0;
1286 pom =
che_m(i,zeta0);
1315 if (
G_prm.
vypisy>4) printf(
"o.k.(che_osklivost = %f)", vysledek);
1326 double *
zeta0 = NULL;
1327 double *zeta = NULL;
1331 double osklivost0 = 0.0;
1332 double osklivost = 0.0;
1338 if ( zeta0 == NULL )
1340 printf (
"Malo pameti!\n");
1347 printf (
"Malo pameti!\n");
1354 osklivost0=
che_osklivost(zeta0, &zapornych0, &nulovych0, &nejhorsi0);
1355 if (osklivost0 <= 1.0)
1357 if (osklivost0 != 0.0)
1372 case 0: zeta[j] =0.0;
break;
1377 osklivost=
che_osklivost (zeta, &zapornych0, &nulovych0, &nejhorsi0);
1378 if (osklivost < osklivost0)
1380 osklivost0 = osklivost;
1386 if (osklivost == 0.0)
break;
1396 P_che[i].
zeta0 = zeta0[i];
1400 printf(
"\nzeta0 se nepodarilo nastavit (osklivost je 1.0+(%f))", osklivost0-1.0);
1415 double *zeta = NULL;
1417 double *skala = NULL;
1419 double *hodnota = NULL;
1421 double *delta = NULL;
1422 double *prstr = NULL;
1425 double stara_norma = 0.0;
1432 P_lat[i].
m = P_lat[i].
m0;
1440 P_lat[i].
m = P_lat[i].
m0;
1442 fw = fopen(soubor,
"a");
1443 fprintf (fw,
"\nchemie: URCITE NEKOREKTNI POCATECNI PODMINKA!\t");
1450 printf (
"Malo pameti!\n");
1455 if ( prstr == NULL )
1457 printf (
"Malo pameti!\n");
1462 if ( delta == NULL )
1464 printf (
"Malo pameti!\n");
1471 printf (
"Malo pameti!\n");
1476 if ( skala == NULL )
1478 printf (
"Malo pameti!\n");
1485 printf (
"Malo pameti!\n");
1490 if ( hodnota == NULL )
1492 printf (
"Malo pameti!\n");
1496 if ( hprvky == NULL )
1498 printf (
"Malo pameti!\n");
1504 zeta[i]=P_che[i].
zeta0;
1509 fw = fopen(soubor,
"a");
1510 fprintf (fw,
"\nK -> ");
1529 if (norma>stara_norma)
1534 fw = fopen(soubor,
"a");
1535 fprintf(fw,
"\n ( - omega = %f )",
G_prm.
omega);
1538 stara_norma = norma;
1541 else if (norma*1.5 < stara_norma)
1554 fw = fopen(soubor,
"a");
1555 fprintf(fw,
"\n ( + omega = %f )",
G_prm.
omega);
1558 stara_norma = norma;
1567 fw = fopen(soubor,
"a");
1568 fprintf(fw,
"\n%d. VNEJSI CYKLUS", pruchodu);
1572 fw = fopen(soubor,
"a");
1573 fprintf(fw,
"\nmolality:");
1576 fprintf(fw,
"\t%f",
che_m(i,zeta));
1583 fw = fopen(soubor,
"a");
1584 fprintf (fw,
"\nchemie: Gauss spadnul!");
1591 fw = fopen(soubor,
"a");
1592 fprintf (fw,
"\n> delta=");
1599 fw = fopen(soubor,
"a");
1600 fprintf (fw,
"\nchemie: PATRNE NEKOREKTNI POCATECNI PODMINKA!\t");
1615 fw = fopen(soubor,
"a");
1616 fprintf (fw,
"\nchemie: NEMOHU DODRZET POZADOVANOU PRESNOST!\n");
1621 fw = fopen(soubor,
"a");
1622 fprintf (fw,
"\nchemie: PATRNE PRILIS RYCHLE KINETICKE REAKCE!\t");
1628 P_lat[i].
m =
che_m(i,zeta);
1694 poloha2[j] = poloha[j]+posunuti[j];
1703 double maximum = 0.0;
1719 printf(
"\nchemie: Tohle se vubec nemelo stat, nerozumim tomu - nelze uz zkratit spotrebu latky!");
1722 if (maximum>=o_kolik)
1739 double *poloha = NULL;
1740 double *poloha2 = NULL;
1745 double *rychlosti = NULL;
1746 double *posunuti = NULL;
1758 if (
G_prm.
vypisy>4) printf(
"\nche_pomala_kinetika: ");
1763 if ( poloha == NULL )
1765 printf (
"Malo pameti!\n");
1770 if ( poloha2 == NULL )
1772 printf (
"Malo pameti!\n");
1777 if ( rychlosti == NULL )
1779 printf (
"Malo pameti!\n");
1786 printf (
"Malo pameti!\n");
1793 printf (
"Malo pameti!\n");
1800 printf (
"Malo pameti!\n");
1807 printf (
"Malo pameti!\n");
1812 if ( posunuti == NULL )
1814 printf (
"Malo pameti!\n");
1818 for (krok = 0; krok<poc_kroku; krok++)
1822 poloha[j] = P_lat[j].
m0;
1823 if (P_lat[j].m0<0.0)
1825 printf(
"\nchemie: Vstup do pomalych kinetickych reakci obsahoval zapornou molalitu %d. latky-neprobehne vypocet!!", j+1);
1876 printf(
"\nchemie: pri pomalych kinetickych reakcich dosla %d. latka (%f)\t", j+1, poloha2[j]);
1884 P_lat[j].
m0 = poloha2[j];
1885 P_lat[j].
m = poloha2[j];
1886 if (P_lat[j].m0<0.0)
1888 if (P_lat[j].m0>-1.e-20)
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);
1924 if (
G_prm.
vypisy>4) printf(
"o.k. (che_pomala_kinetika)");
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);
1987 printf(
"\n (%d): ", i);
1989 printf(
"\n stech. koef.: ");
1994 printf(
"\n exponenty: ");
1997 printf(
"%f ", P_che[i].
exponent[j]);
2007 printf(
"Uvolneni che_ P_lat, P_che : " );
2008 if ( P_lat != NULL )
2010 free( P_lat ); P_lat = NULL;
2013 if ( P_che != NULL )
2015 free( P_che ); P_che = NULL;
2027 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)
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]
double che_dK1_(double *zeta, int rce, int smer, int vnoreni)