linux-l: Re: C frage
Carlos Gherardelli Tel. 00-49-30-314-79306
carlos at olymp.fb10.tu-berlin.de
Do Apr 9 12:40:45 CEST 1998
Hi,
ich mache die simulation von ein reaktor und dafür muss ich
ein differential G.S. lössen. Dafür benutze ich die routinen von
numerical recipes in C mit ganz kleine modifikationen (nur ein
paar zaehler rein getan). Ich mache alles auf float basis und
kann sein dass es daran liegt(?).
Ich denke dass der C Übersetzer von SUN mindestens ANSI ist (?)
Die programme unten rufen sich folgendermasse aus:
das main program ruft cama_doer,
cama_doer ruft die funktion cinet_1 wo das diff. gl. lösser
odeint1 (von numerical recipes in c) aufgerufen wird, wobei das diff.
gleichungs
system (funktion der_reakr2-1) als ein pointer übergeben wird.
#include <stdio.h>
#include <math.h>
#include "../../rutinas/header/nr.h"
#include "../../rutinas/header/nrutil.h"
#include "../../enth/propiedades.h"
#include "./reaktor.h"
extern float USO2_max,xO2_o,xN2_o,F_o,FSO2_o;
extern float Sup_reac,xSO2_o,mCP_o,grupo;
float dxsav,*xp,**yp; /* defining declarations */
float F0,FFIN,PINT;
int kmax,kount;
float error;
int nrhs; /* counts function evaluations */
*/
/* Vereinfachtes difer. G.S. */
void der_reak2_1(float z,float y[],float dydf[])
{
nrhs++;
dydf[1] = 1.0; /* df/df_SO2 */
dydf[2] = -FSO2_o*Hreac(y[2])/mCP_o; /* dT/df_SO2 */
dydf[3] = -0.01251564*dydf[4]; /* dP/df_SO2 */
dydf[4] = FSO2_o/Sup_reac/rSO3_doer(y); /* dz/df_SO2 */
dydf[5] = drso3_dt1(rSO3_doer,y,1.0,&error); /* dI/df_SO2 */
}
void cinet_1(float *ini_s, int N_ec, float umsatz_f,int cat_typ)
{
int i,nbad,nok;
float eps=1.0e-6,Pmin,*ystart,f,*yaux;
float aux_flujo;
F0=ini_s[1];
FFIN=umsatz_f;
PINT=.00001;
Pmin=0.0;
aux_flujo=0.;
ystart=vector(1,N_ec);
yaux=vector(1,N_ec);
xp=vector(1,500);
yp=matrix(1,10,1,500);
error=0.00001;
/* valores iniciales para la integracion */
ystart[1]=ini_s[1];
ystart[2]=ini_s[2];
ystart[3]=ini_s[3];
ystart[4]=ini_s[4];
ystart[5]=ini_s[5];
f=F0;
nrhs=0;
kmax=1000;
odeint1(ystart,N_ec,F0,FFIN,eps,PINT,Pmin,&nok,&nbad,der_reak2_1,rkqs);
for(i=1;i<=N_ec;++i) ini_s[i]=ystart[i];
free_matrix(yp,1,10,1,500);
free_vector(xp,1,500);
free_vector(ystart,1,N_ec);
free_vector(yaux,1,N_ec);
return;
}
#define NED 5
void cama_doer(float *flujo, float *fraccion, float *temp,float
*largo_tot, int unid, int cama_no)
{
int i;
float aux_r,aux_r1,*va,raux,*flujo_e;
va=vector(1,NED);
flujo_e=vector(1,NED);
flujo_e[1]=*fraccion; /* U_SO2 */
flujo_e[2]=flujo[8]; /* T */
flujo_e[3]=flujo[9]/1.10325; /* P */
flujo_e[4]=*largo_tot; /* Z */
flujo_e[5]=0.; /* d(-1/r)/dT */
cinet_1(flujo_e,NED,USO2_max,unid);
~
...
~
free_vector(flujo_e,1,NED);
free_vector(va,1,NED);
}
--
Carlos Gherardelli
Mehr Informationen über die Mailingliste linux-l