mordakhay

Check Brook progarm

Discussion created by mordakhay on Sep 25, 2008
Latest reply on Sep 29, 2008 by Ceq

Dear all,
Kindly I want to know why this program do well when the parameter nstep is less than 150 . I want any one to compile it and check if the result is big numbers when nstep more than 150.
I use brook 0.5 & MSVS 2005 & vista home edition & nvidia geforce 8400M GS.
- do you think this problem related to display card (Nvidia 8400)?
- why defination of "iter float its<499> = iter(1.0f, 500.0f); " must be before any defination . i.e. if you move it down in the program the token error appears

Thanks alot for your time

 

 

// This program named sum.br used to calculate parameter "ex"
//.......................
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

kernel void electric_field(float exs[],float cees[],float cehs[],float hys[],iter float its<>,float cs[],float pulse,out float o_exs<>{
float to = 1.0f;
o_exs = (cees[its]*exs[its])+(cehs[its]*(hys[its-to]-hys[its]))+(cs[its]*pulse);
}

kernel void magnetic_field(float hys[],float chhs[],float ches[],float o_exs[], iter float its<>,out float o_hys<>
{
    float to = 1.0f;
    o_hys = (chhs[its]*hys[its])+(ches[its]*(o_exs[its]-o_exs[its+to]));

}

int main()
{
    const int kz = 501;
    const int nstep =300;
    const int M = 4;
    const int delta = 10;
    int sp,kc;
    float sigmamax,sigmaze[kz],sigmazh[kz];
    float ex[kz],hy[kz],cee[kz],ceh[kz],chh[kz],che[kz],acs[kz];
    float exs<kz>,hys<kz>,cees<kz>,cehs<kz>,chhs<kz>,ches<kz>;
    float o_exs<kz>,o_hys<kz>,cs<kz>;
    float pi,co,dt,dz,epso,muo,freq,lumbda,tto,spread,fmax;
    float* pulse=NULL;
    int i,k;
    iter float its<499> = iter(1.0f, 500.0f);       
    kc = kz/2;
    sp = (int)kc;
    pi=4*atan(1.);
    co=3e+08;
    epso=8.854;
    epso=epso*1e-6;
    epso=epso*1e-6;
    muo=4*pi;
    muo=muo*1e-4;
    muo=muo*1e-3;
    freq = 600e6;
    lumbda = co/freq;
    dz =lumbda/20;
    dt = dz/co;
    dt = 0.5*dt;
    spread = 10.0;
    tto = 3*spread;
    fmax = 1/(2*dt*spread);
    sigmamax = 0.8*(float)(M+1)/(120*pi*dz);

   for(k=0;k<kz;k++){
        if (k<(kz/2))
       sigmaze[k]=(pow(((float)(delta-k+1)/(float)(delta)),M))*sigmamax;
        else
       sigmaze[k]=(pow(((float)(k-(kz-delta))/(float)(delta)),M))*sigmamax;
    }
    for(k=0;k<kz;k++){
        if (k<kz/2)
    sigmazh[k]=(pow((((float)(delta-k)+0.5)/(float)(delta)),M))*sigmamax;
        else
  sigmazh[k]=(pow((((float)(k-(kz-delta))+0.5)/(float)(delta)),M))*sigmamax;
    }
    for(k=delta+1;k<kz-delta-1;k++){
        sigmaze[k]=0.;
        sigmazh[k]=0.;
    }
 
   for(k=0;k<kz;k++){
   acs[k]=0;
        ex[k]=0;
        hy[k]=0;
        cee[k]=(2*epso-sigmaze[k]*dt)/(2*epso+sigmaze[k]*dt);
        ceh[k]=(2*dt/dz)/(2*epso+sigmaze[k]*dt);
        chh[k]=(2*epso-sigmazh[k]*dt)/(2*epso+sigmazh[k]*dt);
        che[k]=(2*epso*dt/(dz*muo))/(2*epso+sigmazh[k]*dt);
    }

   
    acs[sp]=1;
    streamRead(cees,cee);
    streamRead(cehs,ceh);
    streamRead(chhs,chh);
    streamRead(ches,che);
    streamRead(exs,ex);
    streamRead(hys,hy);
    streamRead(cs,acs);

pulse = (float*)malloc(nstep*sizeof(float));

   pulse[0]=0;
                       

    for(i=1;i<nstep;i++){
      pulse=exp(-0.5*pow(((i-tto)/spread),2));
        if(i%2==0){
            electric_field(exs,cees,cehs,hys,its,cs,pulse
,o_exs);
            magnetic_field(hys,chhs,ches,o_exs,its,o_hys);
        }
        else
        {
            electric_field(o_exs,cees,cehs,o_hys,its,cs,pulse,exs);
            magnetic_field(o_hys,chhs,ches,exs,its,hys);
        }
    }         
   if(i%2==0){
      streamWrite(o_exs,ex);
      streamWrite(o_hys,hy);
      streamWrite(cs,acs);
         }
   else
      {
      streamWrite(cs,acs);
      streamWrite(exs,ex);
      streamWrite(hys,hy);
      }
    for (i=1; i<kz; i++) {
   printf("%e \n",ex
);
    }
printf("program complete\n");
return 0;
}

Outcomes