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