⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 start.c

📁 一维等离子体静电粒子模拟程序
💻 C
📖 第 1 页 / 共 3 页
字号:
/************************************************************************   start**   Read in input file, allocate arrays, normalise variables,**   restore data from a previous run or load in a new particle**   distribution and various other "setting up" steps**   Parameter grid determines type of grid to be loaded:**   grid = 0 non-uniform (constant volume) mesh**   grid = 1 uniform mesh**   grid = 2 linearly decreasing mesh**   grid = 3 uniform mesh with 2 grid spacings***********************************************************************/#include "pdc1.h"#include <xgrafix.h>FILE *InputDeck;void species(int initnp[NSMAX][2], int isp);void Restore(char *filename);int grid, nc0, profile;float iinitn, dr1;void unif_load(int initnp[NSMAX][2]);void cos_load(int initnp[NSMAX][2], float iinitn);void bes_load(int initnp[NSMAX][2], float iinitn);void input_for_rad();/*------------------------------------------------------------*/void start(void){  float Bz, f0;  float ntemp, sum_nc, grad;  char aachar[100];  int i, j, isp, nc1, initnp[NSMAX][2];  /*---------------------------------------------*//* Open files and read in "general" parameters */    if (!WasInputFileGiven)   {  #ifdef MPI_1D    if(my_rank == ROOT){      puts("Syntax:");      puts("\tPDC1 -i <inputdeck> -d [dumpfile]");    }  #else    puts("Syntax:");    puts("\tPDC1 -i <inputdeck> -d [dumpfile]");  #endif    exit(1);  }  InputDeck = fopen(theInputFile, "r");  /*---------------------------------------------*/  /* Read lines until we get to numbers */  while (fscanf(InputDeck,"%d %d %d %f %f %f %f %f %f %f",		&nsp, &nc, &grid, &nc2p, &dt, &r0, &r1, &height, &epsilon, &Bz) <10)    fscanf(InputDeck, "%s", aachar);    while (fscanf(InputDeck, "%f %f %f %f %f %f %f",		&rhoback, &backgrnd_i, &dde, &extr, &extl, &extc, &q_0) < 7)    fscanf(InputDeck, "%s", aachar);    while (fscanf(InputDeck, "%d %c %f %f %f %f %f %f", &ramped,		&src, &dcbias, &dc_ramp, &acbias, &ac_ramp, &f0, &theta0) <8)     fscanf(InputDeck, "%s", aachar); if((src == 'W') ||(src == 'K'))    {      while (fscanf(InputDeck, "%d %f %f %f %f %f %f", &ramped2,                &dcbias2, &dc_ramp2, &acbias2, &ac_ramp2, &f02, &theta02) <7)         fscanf(InputDeck, "%s", aachar);    }     while (fscanf(InputDeck, "%d %d %d %d %d %d %d", &secondary, &ecollisional,		&icollisional, &reflux, &nfft, &nsmoothing, &RT_flag) <7)    fscanf(InputDeck, "%s", aachar);    while (fscanf(InputDeck, "%f %f %d %f %f %d", &seec[0], &seec[1],		&ionspecies, &pressure, &T_gas, &gas) <6)    fscanf(InputDeck, "%s", aachar);    /*---------------------------------------------*/  /* Check for errors in the "general" input parameters */    #ifdef MPI_1D  if (RT_flag) {    printf("For parallel version, RT simulation is not possible\n");    exit(1);  }  #endif  if (extl < 0. || extr < 0. || extc < 0.)  {  #ifdef MPI_1D    if(my_rank == ROOT)      printf("START-ERROR- external circuit improperly defined R,L,C < 0\n");  #else    printf("START-ERROR- external circuit improperly defined R,L,C < 0\n");  #endif    exit(1);  }  if (!dt)  {  #ifdef MPI_1D    if(my_rank == ROOT)      printf("START: dt == 0!!\n");  #else    printf("START: dt == 0!!\n");  #endif    exit(1);  }  if (nsp > NSMAX)  {  #ifdef MPI_1D    if(my_rank == ROOT)      printf("START: nsp > NSMAX.\n");  #else    printf("START: nsp > NSMAX.\n");  #endif    exit(1);  }      /* Check to see if nfft is an integer power of 2 */  if(nfft)  {    for(i=0; i<= 31; i++)    {      if(nfft == (1<<i))       {	i=0;	break;      }    }    if(i)    {    #ifdef MPI_1D      if(my_rank == ROOT)        printf("START: nfft is not an integer power of 2.\n");    #else      printf("START: nfft is not an integer power of 2.\n");    #endif      exit(1);    }  }  ng= nc+1;    /*-----------------------------------*/  /*  Set collision parameters         */   mccptr =argonmcc;         /* gas uses argonmcc (without action) if collisions are off */   if (ecollisional || icollisional)   {      switch (gas)      {         case ARGON:	   mccptr =argonmcc; 	   sigmaMptr =asigma1a; 	   sigmaTptr =asigmaT; 	   mueFacPtr = mue_factor; 	   eion = 15.76;	   eexc = 11.62;	   e_me = 11.55;	   e_miz = 4.16;        #ifdef MPI_1D	   if(my_rank == ROOT)	     printf("Using anisotropic HBS cross-section set\n");	#else           printf("Using anisotropic HBS cross-section set\n");        #endif	   break;         case ARGON_LK:	   mccptr =argonmccLK; 	   sigmaMptr =LK_asigma1a; 	   sigmaTptr =LK_asigmaT; 	   mueFacPtr = mue_factorLK; 	   eion = 15.76;	   eexc = 11.62;	   e_me = 11.55;	   e_miz = 4.16;        #ifdef MPI_1D	   if(my_rank == ROOT)	     printf("Using isotropic L&K cross-section set\n");	#else           printf("Using isotropic L&K cross-section set\n");        #endif	   break;      }   }    /*---------------------------------------------*/  /* Calculate normalised cell radii and volumes */  r_grid = (float  *)malloc(ng*sizeof(float));  dr_n = (float  *)malloc(ng*sizeof(float));/* Constant cell volume mesh */  if (grid == 0)  {      j_pointer = const_vol_grid;      dr = -r0 + sqrt(r0*r0 + (r1*r1 - r0*r0)/nc);      r0 /= dr;      r1 /= dr;      r_grid[0] = r0;      r_grid[1] = r0+1;      for (i=2; i<= nc; i++) r_grid[i] = sqrt(2.0*r_grid[i-1]*r_grid[i-1] - r_grid[i-2]*r_grid[i-2]);      for (i=0; i< nc; i++) dr_n[i] = r_grid[i+1] - r_grid[i];  }/* Constant uniform grid */  else if(grid == 1)  {      j_pointer = unif_grid;      dr = (r1-r0)/nc;      r0 /=dr;      r1 /=dr;      for ( i=0; i<= nc; i++) r_grid[i] = r0 + i;      for ( i=0; i<= nc; i++) dr_n[i] = 1;  }/* Linear dr mesh */  else if(grid == 2)  {      j_pointer = linear_grid;/* determine first dr */      dr = 1.5*(r1 - r0)/nc; /* choose the first grid cell spacing - between 1.2 and 2.0 works best */      r0 /= dr;      r1 /= dr;      sum_nc = 0.0;      for (i=1; i<nc; i++) sum_nc += i;      grad = (r1 - r0 - nc)/sum_nc;      for (i=0; i< nc; i++) dr_n[i] = grad*i + 1.0;      r_grid[0] = r0;      for (i=1; i<= nc; i++) r_grid[i] = r_grid[i-1] + dr_n[i-1];  }/* Uniform mesh with two spacings */  else if(grid == 3)  {     j_pointer = split_grid;     nc0 = 0.2*nc;     nc1 = nc - nc0;     dr = 0.5*(r1 - r0)/nc0;                      /* 1/4 length with nc0 cells */     dr1 = 0.5*(r1 - r0)/nc1;                     /* 3/4 length with nc1 cells */     r0 /= dr;     r1 /= dr;     for (i=0; i< nc0; i++) dr_n[i] = 1.0;         /* normalise by dr */     for (i=nc0; i< nc; i++) dr_n[i] = dr1/dr;     r_grid[0] = r0;     for (i=1; i<= nc; i++) r_grid[i] = r_grid[i-1] + dr_n[i-1];  }  vol = (float  *)malloc(ng*sizeof(float));  vol[0] = r0 + 1.0/3.0;   vol[nc] = dr_n[nc-1]*(r_grid[nc] - dr_n[nc-1]/3.0);   for ( i=1; i< nc; i++)     vol[i] = r_grid[i]*(dr_n[i] + dr_n[i-1]) + (dr_n[i]*dr_n[i] - dr_n[i-1]*dr_n[i-1])/3.0;  /*------------------------------------*/  /* Conversion to dimensionless units */    gas_den = NperTORR*pressure/(T_gas +DBL_MIN);  area0 = TWOPI*r0*dr*height;  theta0 *= TWOPI/360;  Trf =1/(f0+DBL_MIN);  cycle = Trf/dt;  w0 = TWOPI*f0;  w02 = TWOPI*f02;  epsilon*= EPS0;  q_1 = q_2 = q_3 = q_0;  reactor_vol = PI*height*dr*dr*(r1*r1 - r0*r0);  /* in real units */  rescale_on=1;    /*-----------------------------------------------*/  /* Calculate normalisation parameters */  me_e = EMASS/ECHARGE;  vscale = dr/dt;  ptopn = (ECHARGE/EMASS)*dt*dt/(dr*dr);  /* Normalisation for potential */  dntod =  nc2p/(PI*height*dr*dr); /* Normalisation for density */  /* Check ramped source parameters                      */  if(ramped)  {    if(dc_ramp*dcbias < 0.0)    {     #ifdef MPI_1D       if(my_rank == ROOT){         fprintf(stderr, "\nWARNING: Ramp and dcbias have opposite signs.");         fprintf(stderr, "\nThe external source will be discontineous!\n\n");       }     #else       fprintf(stderr, "\nWARNING: Ramp and dcbias have opposite signs.");       fprintf(stderr, "\nThe external source will be discontineous!\n\n");     #endif    }    if (dc_ramp) risetime= fabs(dcbias)/fabs(dc_ramp);  } if(ramped2)  {    if(dc_ramp2*dcbias2 < 0.0)    {     #ifdef MPI_1D       if(my_rank == ROOT){         fprintf(stderr, "\nWARNING: Ramp and dcbias have opposite signs.");         fprintf(stderr, "\nThe external source will be discontineous!\n\n");       }     #else       fprintf(stderr, "\nWARNING: Ramp and dcbias have opposite signs.");       fprintf(stderr, "\nThe external source will be discontineous!\n\n");     #endif    }    if (dc_ramp2) risetime2= fabs(dcbias2)/fabs(dc_ramp2);      }  /*-----------------------------------*/  /* Allocate space for field parameters */    r_array= (float  *)malloc(ng*sizeof(float));  for(i=0; i< ng; i++) r_array[i]= r_grid[i]*dr;  sp_n= (float  **)malloc(nsp*sizeof(float  *));  sp_n_k= (float  **)malloc(nsp*sizeof(float  *));  sp_n_0= (float  **)malloc(nsp*sizeof(float  *));  sp_n_mcc= (float  **)malloc(nsp*sizeof(float  *));  for(i=0; i<nsp; i++)	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -