コード例 #1
0
ファイル: LibFileIOMgr.cpp プロジェクト: flake123p/ProjectH
void LibIO_Demo_FPrintf_FScanf(void)
{
	u32 printCharCount;
	
	LibFileIoClass ioFile("Test_DeleteMe.txt", "w+b");

	ioFile.FileOpen();

	ASSERT_CHK( rc, LibIO_FPrintf(printCharCount, ioFile.fp, "123 %d %d\n", 33, 44) );

	DUMPD(printCharCount);

	rewind(ioFile.fp);

	char tempStr[10];
	u32 scanCount;
	ASSERT_CHK( rc, LibIO_FScanf(scanCount, ioFile.fp, "%s", tempStr) );
	DUMPD(scanCount);
	DUMPS(tempStr);
	ASSERT_CHK( rc, LibIO_FScanf(scanCount, ioFile.fp, "%s", tempStr) );
	DUMPD(scanCount);
	DUMPS(tempStr);
	ASSERT_CHK( rc, LibIO_FScanf(scanCount, ioFile.fp, "%s", tempStr) );
	DUMPD(scanCount);
	DUMPS(tempStr);
	
	rc = LibIO_FScanf(scanCount, ioFile.fp, "%s", tempStr);
	LibError_PrintErrorMessage(rc);
}
コード例 #2
0
ファイル: shareplugin.cpp プロジェクト: KDE/kdeconnect-kde
void SharePlugin::shareUrl(const QUrl& url)
{
    NetworkPackage package(PACKAGE_TYPE_SHARE_REQUEST);
    if(url.isLocalFile()) {
        QSharedPointer<QIODevice> ioFile(new QFile(url.toLocalFile()));
        package.setPayload(ioFile, ioFile->size());
        package.set<QString>(QStringLiteral("filename"), QUrl(url).fileName());
    } else {
        package.set<QString>(QStringLiteral("url"), url.toString());
    }
    sendPackage(package);
}
コード例 #3
0
ファイル: setup.cpp プロジェクト: LingDu-san/SPH-DEM
int main(int argc, char *argv[]) {
   if (argc != 2) {
      cout << "Usage: setup outfilename" << endl;
      return(-1);
   }
   string filename = argv[1];

   vector<Cparticle> ps;
   Cparticle p;
   cout << "Creating box with sides: rmax = ["<<RMAX[0]<<" "<<RMAX[1]<<"] rmin = ["<<RMIN[0]<<" "<<RMIN[1]<<"]"<<endl;
   cout << "Reynolds Number = "<<REYNOLDS_NUMBER<<endl;
   cout << "Density = "<<DENS<<endl;
   cout << "number of particles on side = "<<NX<<endl;
   cout << "alpha = "<<ALPHA<<endl;
   cout << "viscosity = "<<VISCOSITY<<endl;
   cout << "maxtime = "<<MAXTIME<<endl;
   cout << "term vel (3d) is "<<(2.0/9.0)*(DEM_DENS-DENS)*9.81*pow(DEM_RADIUS,2)/(VISCOSITY*DENS)<<endl;
   cout << "term vel (2d) is "<<(1.0/3.0)*(DEM_DENS-DENS)*9.81*pow(DEM_RADIUS,2)/(VISCOSITY*DENS)<<endl;
 
   double tsc = Nsph::courantCondition(H,2*SPSOUND);
   double tsv = Nsph::viscDiffusionCondition(H,VISCOSITY);
   cout <<"simulation will take "<<int((MAXTIME/tsc)+1)<<" steps according to Courant condition, "<<int((MAXTIME/tsv)+1)<<" steps according to visc diffusion condition"<<endl;

   p.tag = ps.size()+1;
   p.r[0] = (RMAX[0]-RMIN[0])/2;
   p.r[1] = (RMAX[1]-RMIN[1])/2;
   p.r[2] = (RMAX[2]-RMIN[2])/2;
   p.dens = DEM_DENS;
   p.h = DEM_RADIUS/2;
   p.mass = (4.0/3.0)*PI*pow(DEM_RADIUS,3)*DEM_DENS;
   p.v = 0.0;
   p.vhat = p.v;
   p.iam = dem;
   ps.push_back(p);

   const double totalDEMVol = p.mass/p.dens;
   //const double totalDEMVol = 0;
   const double newLiqDens = DENS*((RMAX[1]-RMIN[1])*(RMAX[0]-RMIN[0])*2*DEM_RADIUS-totalDEMVol)/((RMAX[1]-RMIN[1])*(RMAX[0]-RMIN[0])*2*DEM_RADIUS);
   cout << "after adding dem particles, new liquid density is "<<newLiqDens<<endl; 

   for (int i=0;i<NX;i++) {
         cout << "\rParticle ("<<i<<","<<"0"<<"). Generation "<<((i+2)*(NY+4))/double((NX+4)*(NY+4))*100<<"\% complete"<<flush;
      for (int j=0;j<NY;j++) {
         for (int k=0;k<NZ;k++) {
            p.tag = ps.size()+1;
            p.r = (i+0.5)*PSEP+RMIN[0],(j+0.5)*PSEP+RMIN[1],(k+0.5)*PSEP+RMIN[2];
            p.dens = newLiqDens;
            p.mass = pow(PSEP,NDIM)*newLiqDens;
            p.h = HFAC*pow(p.mass/p.dens,1.0/NDIM);
            p.v = 0.0;
            p.vhat = p.v;
            p.iam = sph;
            p.alpha = ALPHA;
            ps.push_back(p);
         }
      }
   }
   

   cout << "Total number of particles = " << ps.size() << endl;

   CglobalVars globals;

   vector<vector<double> > vprocDomain(globals.mpiSize);
   vector<Array<int,NDIM> > vprocNeighbrs(globals.mpiSize);
   vector<particleContainer > vps;
   vectInt split;
   split = 1,1,1;
   particleContainer pps;
   for (int i=0;i<ps.size();i++) {
      pps.push_back(ps[i]);
   }
   Nmisc::splitDomain(pps,split,vps,vprocDomain,vprocNeighbrs);


   cout << "Opening files for writing..."<<endl;
   Cio_data_vtk ioFile(filename.c_str(),&globals);
   cout << "Calculating Output stuff.."<<endl;
   //sph.calcOutputVars();
   //customOutput.calcOutput(0,&customSim,&ioFile);
   cout << "Writing Restart data to file..."<<endl;
   int nProc = product(split);

   for (int i=0;i<nProc;i++) {
      globals.mpiRank = i;
      for (int j=0;j<NDIM*2;j++)
         globals.procDomain[j] = vprocDomain[i][j];
      globals.procNeighbrs = vprocNeighbrs[i];
      ioFile.setFilename(filename.c_str(),&globals);
      ioFile.writeGlobals(0,&globals);
      ioFile.writeRestart(0,vps[i],&globals);
      ioFile.writeDomain(0,&globals);
      globals.mpiRank = 0;
   }
}
コード例 #4
0
ファイル: setup.cpp プロジェクト: LingDu-san/SPH-DEM
int main(int argc, char *argv[]) {
   if (argc != 2) {
      cout << "Usage: setup outfilename" << endl;
      return(-1);
   }
   string filename = argv[1];

   vector<Cparticle> ps;
   Cparticle p;
   cout << "Creating box with sides: rmax = ["<<BMAX[0]<<" "<<BMAX[1]<<"] rmin = ["<<BMIN[0]<<" "<<BMIN[1]<<"]"<<endl;
   cout << "Particle Separation = "<<PSEP<<endl;
   cout << "Reynolds Number = "<<REYNOLDS_NUMBER<<endl;
   cout << "Density = "<<DENS<<endl;
   cout << "number of particles on side = "<<NX<<endl;
   cout << "alpha = "<<ALPHA<<endl;
   cout << "viscosity = "<<VISCOSITY<<endl;
   cout << "maxtime = "<<MAXTIME<<endl;
 
   double tsc = Nsph::courantCondition(H,2*SPSOUND);
   double tsv = Nsph::viscDiffusionCondition(H,VISCOSITY);
   cout <<"simulation will take "<<int((MAXTIME/tsc)+1)<<" steps according to Courant condition, "<<int((MAXTIME/tsv)+1)<<" steps according to visc diffusion condition"<<endl;

   //do boundaries here

   vect points[5];
   points[0] = BMIN[0],BMAX[1];
   points[1] = BMIN[0],BMIN[1];
   points[2] = BMAX[0],BMIN[1];
   points[3] = BMAX[0],BMAX[1];
   points[4] = BMIN[0],BMAX[1];

   vect normals[5];
   normals[0] = 1,0;
   normals[1] = 0,1;
   normals[2] = -1,0;
   normals[3] = 0,-1;
   normals[4] = 1,0;

   bool concave[5];
   concave[0] = true;
   concave[1] = true;
   concave[2] = true;
   concave[3] = true;
   concave[4] = true;
   
   Nmisc::boundaryLine(ps,points,normals,concave,5,boundary);


   cout << "Total number of boundary particles = " << ps.size() << endl;

   //do fluid here
   for (int i=2;i<=NX;i++) {
         cout << "\rParticle ("<<i<<","<<"0"<<"). Generation "<<((i+2)*(NY+4))/double((NX+4)*(NY+4))*100<<"\% complete"<<flush;
      for (int j=2;j<=NY;j++) {

         p.r = i*PSEP+BMIN[0],j*PSEP+BMIN[1];

         p.tag = ps.size()+1;
         p.dens = DENS;
         p.mass = PSEP*PSEP*DENS;
         p.h = H;
         p.v = 0,0;
         p.iam = sph;
         ps.push_back(p);
      }
   }


   cout << "Total number of particles = " << ps.size() << endl;

   CglobalVars globals;


   vector<vector<double> > vprocDomain(globals.mpiSize);
   vector<Array<int,NDIM> > vprocNeighbrs(globals.mpiSize);
   vector<particleContainer > vps;
   vectInt split;
   split = 1,1;
   particleContainer pps;
   for (int i=0;i<ps.size();i++) {
      pps.push_back(ps[i]);
   }
   Nmisc::splitDomain(pps,split,vps,vprocDomain,vprocNeighbrs);



   //CdataLL *data = new CdataLL(ps,globals);
   //CsphIncompress sph(data);
   //CcustomOutput customOutput(data);
   //CcustomSim customSim(data,globals.time);
   cout << "Opening files for writing..."<<endl;
   Cio_data_vtk ioFile(filename.c_str(),&globals);
   cout << "Writing Restart data to file..."<<endl;
   int nProc = product(split);
   for (int i=0;i<nProc;i++) {
      globals.mpiRank = i;
      for (int j=0;j<NDIM*2;j++)
         globals.procDomain[j] = vprocDomain[i][j];
      globals.procNeighbrs = vprocNeighbrs[i];
      ioFile.setFilename(filename.c_str(),&globals);
      ioFile.writeGlobals(0,&globals);
      ioFile.writeRestart(0,vps[i],&globals);
      ioFile.writeDomain(0,&globals);
      globals.mpiRank = 0;
   }

}
コード例 #5
0
ファイル: setup.cpp プロジェクト: LingDu-san/SPH-DEM
int main(int argc, char *argv[]) {
   if (argc != 2) {
      cout << "Usage: setup outfilename" << endl;
      return(-1);
   }
   string filename = argv[1];

   vector<Cparticle> ps;
   Cparticle p;
   cout << "Creating length with sides: rmax = ["<<RMAX[0]<<"] rmin = ["<<RMIN[0]<<"]"<<endl;
   cout << "Reynolds Number = "<<REYNOLDS_NUMBER<<endl;
   cout << "Density = "<<DENS<<endl;
   cout << "number of particles on side = "<<NX<<endl;
   cout << "alpha = "<<ALPHA<<endl;
   cout << "viscosity = "<<VISCOSITY<<endl;
   cout << "maxtime = "<<MAXTIME<<endl;
 
   double tsc = Nsph::courantCondition(H,2*SPSOUND);
   double tsv = Nsph::viscDiffusionCondition(H,VISCOSITY);
   cout <<"simulation will take "<<int((MAXTIME/tsc)+1)<<" steps according to Courant condition, "<<int((MAXTIME/tsv)+1)<<" steps according to visc diffusion condition"<<endl;

   gsl_rng *rng = gsl_rng_alloc(gsl_rng_ranlxd1);
   gsl_rng_set(rng,1);

   int numBound1,numBound2;
   if (PERIODIC[0]) {
      numBound1 = 1;
      numBound2 = 0;
   } else {
      numBound1 = 4;
      numBound2 = 4;
   }

   for (int i=1-numBound1;i<=NX+numBound2-1;i++) {
         cout << "\rParticle ("<<i<<","<<"0"<<"). Generation "<<((i+2)*(NY+4))/double((NX+4)*(NY+4))*100<<"\% complete"<<flush;
         p.tag = ps.size()+1;
         if (PERIODIC[0]) {
            p.r[0] = (i+0.5)*PSEP+RMIN[0];
         } else {
            p.r[0] = i*PSEP+RMIN[0];
         }
         p.dens = DENS;
         p.mass = PSEP*DENS;
         p.mass += gsl_ran_gaussian(rng,0.2*p.mass);
         p.h = H;
         p.v = 0,0;
         //p.v = -p.r[1]*BOX_GLOB_ANGVEL,p.r[0]*BOX_GLOB_ANGVEL;
         //const vect middle = (RMAX[0]-RMIN[0])/2.0 + RMIN[0];
         //const vect size = (RMAX[0]-RMIN[0])/7.0;
         //const double sigma = (RMAX[0]-RMIN[0])/14.0;
         //if (all(p.r>=middle)&&all(p.r<=middle+size)) {
         //   p.v = sin(2.0*PI*(1.0/size)*(p.r-middle));
         //} else {
         //   p.v = 0;
         //}
         //if (all(p.r>RMIN[0])&&all(p.r<RMAX[0])) {
         //   p.v = 0.1*exp(-len2(p.r-middle)/(2.0*pow(sigma,2)));
            //p.v = 0.1*sin(2.0*PI*3.0*p.r);
         //} else {
         //   p.v = 0.0;
         //}

         if ((i<=0)&&(!PERIODIC[0])) {
            p.iam = sphBoundary;
            p.norm1[0] = -i*PSEP;
            p.norm1[1] = 0;
            p.dist = len(p.norm1);
            if (p.dist==0) {
               p.norm1[0] = 1.0;
            } else {
               p.norm1 = p.norm1/p.dist;
            }
         } else if ((i>=NX)&&(!PERIODIC[0])) {
            p.iam = sphBoundary;
            p.norm1[0] = (NX-i)*PSEP;
            p.norm1[1] = 0;
            p.dist = len(p.norm1);
            if (p.dist==0) {
               p.norm1[0] = -1.0;
            } else {
               p.norm1 = p.norm1/p.dist;
            }
         } else {
            p.iam = sph;
            p.v[0] = 0.1*sin(PI*p.r[0]/PSEP);
            p.v[0] += 0.1*sin(10.0*PI*p.r[0]/(RMAX[0]-RMIN[0]));
            cout << "p.v  = "<<p.v<<endl;
         }
         p.alpha = ALPHA;
         ps.push_back(p);
   }


   cout << "Total number of particles = " << ps.size() << endl;

   CglobalVars globals;


   vector<vector<double> > vprocDomain(globals.mpiSize);
   vector<Array<int,NDIM> > vprocNeighbrs(globals.mpiSize);
   vector<particleContainer > vps;
   vectInt split;
   split = 1;
   particleContainer pps;
   for (int i=0;i<ps.size();i++) {
      pps.push_back(ps[i]);
   }
   Nmisc::splitDomain(pps,split,vps,vprocDomain,vprocNeighbrs);



   //CdataLL *data = new CdataLL(ps,globals);
   //CsphIncompress sph(data);
   //CcustomOutput customOutput(data);
   //CcustomSim customSim(data,globals.time);


   cout << "Opening files for writing..."<<endl;
   Cio_data_vtk ioFile(filename.c_str(),&globals);
   cout << "Calculating Output stuff.."<<endl;
   //sph.calcOutputVars();
   //customOutput.calcOutput(0,&customSim,&ioFile);
   cout << "Writing Restart data to file..."<<endl;
   int nProc = product(split);
   for (int i=0;i<nProc;i++) {
      globals.mpiRank = i;
      ioFile.setFilename(filename.c_str(),&globals);
      ioFile.writeGlobals(0,&globals);
      ioFile.writeRestart(0,vps[i],&globals);
      globals.mpiRank = 0;
   }
   cout << "Writing Global data to file..."<<endl;
   //ioFile.writeGlobals(0,&globals);
   ioFile.writeDomain(0,vprocDomain,vprocNeighbrs);


   //Write restart file for John
   /*ofstream fo("restartJohn.dat");
   fo <<"h = "<<H<<" mass = "<<ps[0].mass<<" dens = "<<ps[0].dens<<" psep = "<<PSEP<<" Re = "<<REYNOLDS_NUMBER<<" kinematic viscosity = "<<VISCOSITY<<" n = "<<ps.size()<<endl;
   fo <<"r_x r_y v_x v_y flag(0=fluid,1=boundary)"<<endl;
   for (int i=0;i<ps.size();i++) {
      fo << ps[i].r[0]<<' '<<ps[i].r[1]<<' '<<ps[i].v[0]<<' '<<ps[i].v[1]<<' '<<ps[i].iam<<endl;
   }*/

}
コード例 #6
0
ファイル: setup.cpp プロジェクト: LingDu-san/SPH-DEM
int main(int argc, char *argv[]) {
   if (argc != 2) {
      cout << "Usage: setup outfilename" << endl;
      return(-1);
   }
   string filename = argv[1];

   vector<Cparticle> ps;
   Cparticle p;
   cout << "Creating box with sides: rmax = ["<<BMAX[0]<<" "<<BMAX[1]<<"] rmin = ["<<BMIN[0]<<" "<<BMIN[1]<<"]"<<endl;
   cout << "Reynolds Number = "<<REYNOLDS_NUMBER<<endl;
   cout << "Density = "<<DENS<<endl;
   cout << "number of particles on side = "<<NX<<endl;
   cout << "alpha = "<<ALPHA<<endl;
   cout << "viscosity = "<<VISCOSITY<<endl;
   cout << "maxtime = "<<MAXTIME<<endl;
   cout << "term vel (3d) is "<<(2.0/9.0)*(DEM_DENS-DENS)*9.81*pow(DEM_RADIUS,2)/(VISCOSITY*DENS)<<endl;
   cout << "term vel (2d) is "<<(1.0/3.0)*(DEM_DENS-DENS)*9.81*pow(DEM_RADIUS,2)/(VISCOSITY*DENS)<<endl;
   //cout << "term vel is "<<(1.0/6.0)*(DEM_DENS-DENS)*9.81*pow(DEM_RADIUS,1)/(VISCOSITY*DENS)<<endl;
 
   double tsc = Nsph::courantCondition(H,2*SPSOUND);
   double tsv = Nsph::viscDiffusionCondition(H,VISCOSITY);
   cout <<"simulation will take "<<int((MAXTIME/tsc)+1)<<" steps according to Courant condition, "<<int((MAXTIME/tsv)+1)<<" steps according to visc diffusion condition"<<endl;

   Nmisc::boundaryCylinder(ps,CYLINDER_ORIGIN,CYLINDER_RADIUS,CYLINDER_HEIGHT);
   vect origin = CYLINDER_ORIGIN;
   origin[2] += 1.5*PSEP;
   Nmisc::sphCylinder(ps,origin);

   p.tag = ps.size()+1;
   p.r = CYLINDER_ORIGIN;
   p.r[2] = CYLINDER_HEIGHT;
   p.dens = DEM_DENS;
   p.h = DEM_RADIUS/2;
   p.mass = (4.0/3.0)*PI*pow(DEM_RADIUS,3)*DEM_DENS;
   p.v = 0.0;
   p.vhat = p.v;
   p.iam = dem;
   ps.push_back(p);

   cout << "Total number of particles = " << ps.size() << endl;

   CglobalVars globals;

   vector<vector<double> > vprocDomain(globals.mpiSize);
   vector<Array<int,NDIM> > vprocNeighbrs(globals.mpiSize);
   vector<particleContainer > vps;
   vectInt split;
   split = 1,1,1;
   particleContainer pps;
   for (int i=0;i<ps.size();i++) {
      pps.push_back(ps[i]);
   }
   Nmisc::splitDomain(pps,split,vps,vprocDomain,vprocNeighbrs);


   cout << "Opening files for writing..."<<endl;
   Cio_data_vtk ioFile(filename.c_str(),&globals);
   cout << "Calculating Output stuff.."<<endl;
   //sph.calcOutputVars();
   //customOutput.calcOutput(0,&customSim,&ioFile);
   cout << "Writing Restart data to file..."<<endl;
   int nProc = product(split);
   for (int i=0;i<nProc;i++) {
      globals.mpiRank = i;
      ioFile.setFilename(filename.c_str(),&globals);
      ioFile.writeGlobals(0,&globals);
      ioFile.writeRestart(0,vps[i],&globals);
      globals.mpiRank = 0;
   }
   cout << "Writing Global data to file..."<<endl;
   //ioFile.writeGlobals(0,&globals);
   ioFile.writeDomain(0,vprocDomain,vprocNeighbrs);

}
コード例 #7
0
ファイル: setup.cpp プロジェクト: LingDu-san/SPH-DEM
int main(int argc, char *argv[]) {
   if (argc != 2) {
      cout << "Usage: setup outfilename" << endl;
      return(-1);
   }
   string filename = argv[1];

   vector<Cparticle> ps;
   Cparticle p;
   cout << "Creating box with sides: rmax = ["<<BMAX[0]<<" "<<BMAX[1]<<"] rmin = ["<<BMIN[0]<<" "<<BMIN[1]<<"]"<<endl;
   cout << "Reynolds Number = "<<REYNOLDS_NUMBER<<endl;
   cout << "Density = "<<DENS<<endl;
   cout << "speed of sound = "<<SPSOUND<<endl;
   cout << "prb = "<<PRB<<endl;
   cout << "number of particles on side = "<<NX<<endl;
   cout << "max num partilces = "<<MAX_NUM_PARTICLES_PER_CPU<<endl;
   cout << "sph boundary density is "<<SPHBOUNDARYDENS<<endl;
   cout << "VMAX is "<<VMAX<<endl;

   cout << "PSEP = "<<PSEP<<endl;
   cout << "p.mass = "<<pow(PSEP,NDIM)*DENS<<endl;
   cout << "alpha = "<<ALPHA<<endl;
   cout << "viscosity = "<<VISCOSITY<<endl;
   cout << "maxtime = "<<MAXTIME<<endl;
   cout << "term vel (3d) is "<<VREF<<endl;
   cout << "term vel (stokes) is "<<(2.0/9.0)*(DEM_DENS-DENS)*9.81*pow(DEM_RADIUS,2)/(VISCOSITY*DENS)<<endl;
   cout << "vmax = "<<VMAX<<endl;
   cout << "fluid RE = "<<VMAX*L/VISCOSITY<<endl;
   cout << "test = "<<(sqrt(8*pow(1.0/40.0,3)*1000*(7000)*9.81/18)/1000)<<endl;
   cout << "DEM_RADIUS = "<<DEM_RADIUS<<endl;
   cout << "gamma must be less than" <<2.0*sqrt(DEM_K*DEM_MIN_REDUCED_MASS)<<endl;
 
   double tsc = Nsph::courantCondition(H,2*SPSOUND);
   double tsv = Nsph::viscDiffusionCondition(H,VISCOSITY);
   double tdem = Nsph::demCondition();
   double liqtdem = Nsph::liqDemCondition();
   cout <<"dem contact = "<<50*tdem<<endl;
   cout <<"liq dem ts= "<<20.0*liqtdem<<endl;
   cout <<"fluid cfl= "<<tsc<<endl;
   cout <<"simulation will take "<<int((MAXTIME/tsc)+1)<<" steps according to Courant condition, "<<int((MAXTIME/tsv)+1)<<" steps according to visc diffusion condition"<<int((MAXTIME/tdem)+1)<<" steps according to the DEM condition"<<int((MAXTIME/liqtdem)+1)<<" steps according to the LIQ DEM condition"<<endl;


#ifdef SPHBOUNDARY
   const int Z_LIM = -2;
#else
   const int Z_LIM = 0;
#endif

   for (int i=0;i<NX;i++) {
         cout << "\rParticle ("<<i<<","<<"0"<<"). Generation "<<((i+2)*(NY+4))/double((NX+4)*(NY+4))*100<<"\% complete"<<flush;
      for (int j=0;j<NY;j++) {
         for (int k=Z_LIM;k<=NZ;k++) {
            p.tag = ps.size()+1;
#ifdef GHOST_BOUNDARY
            if (k%2==0) {
               p.r = (i+0.5)*PSEP+RMIN[0],(j+0.5)*PSEP+RMIN[1],(k+0.5)*PSEP+RMIN[2];
            } else {
               p.r = (i)*PSEP+RMIN[0],(j)*PSEP+RMIN[1],(k+0.5)*PSEP+RMIN[2];
            }
#else
            if (k%2==0) {
               p.r = (i+0.5)*PSEP+RMIN[0],(j+0.5)*PSEP+RMIN[1],k*PSEP+RMIN[2];
            } else {
               p.r = (i)*PSEP+RMIN[0],(j)*PSEP+RMIN[1],k*PSEP+RMIN[2];
            }
#endif
            p.dens = DENS;
            p.mass = pow(PSEP,NDIM)*DENS;
            p.h = HFAC*pow(p.mass/p.dens,1.0/NDIM);
            p.v = 0.0;
            p.vhat = p.v;
#ifndef GHOST_BOUNDARY
            if (k<=0) {
#ifdef SPHBOUNDARY
               p.iam = sphBoundary;
               p.dens = SPHBOUNDARYDENS;
#else
               p.iam = boundary;
#endif
               p.norm1 = 0,0,1;
               p.norm3 = 0,1,0;
               p.norm2 = 0;
            } else {
               p.iam = sph;
               p.norm1 = 0;
               p.norm3 = 0;
}
	    #endif
            ps.push_back(p);
         }
      }
   }
   int numSPH = ps.size();

   CglobalVars globals;
   globals.procNeighbrs = 0;
   globals.procNeighbrs(1,1,1) = -1;
   for (int j=0;j<NDIM;j++) {
      if (!PERIODIC[j]) {
         globals.procDomain[2*j] = RMIN[j]-0.25*(RMAX[j]-RMIN[j]);
      } else {
         globals.procDomain[2*j] = RMIN[j];
      }
      if (!PERIODIC[j]) {
         globals.procDomain[2*j+1] = RMAX[j]+0.25*(RMAX[j]-RMIN[j]);
      } else {
         globals.procDomain[2*j+1] = RMAX[j];
      }
   }
   MPI_Init(&argc, &argv);
   MPI_Comm_size(MPI_COMM_WORLD, &(globals.mpiSize));
   MPI_Comm_rank(MPI_COMM_WORLD, &(globals.mpiRank));
   ps.reserve(MAX_NUM_PARTICLES_PER_CPU);
   cout <<"creating new data structure"<<endl;
   CdataLL *data = new CdataLL(ps,globals,true);
   cout <<"adding dem particles"<<endl;
#ifdef MANY_PARTICLES
   double min[3];
   double max[3];
   for (int i=0;i<3;i++) {
      if (i==2) {
#ifdef IN_WATER
         min[i] = RMIN[i] + (RMAX[i]-RMIN[i])/2 - PSEP;
         max[i] = WMAX - 2.0*PSEP;
#else
         min[i] = WMAX+PSEP;
         max[i] = WMAX+PSEP+(RMAX[i]-RMIN[i])/4;
#endif
      } else {
#ifdef SMALL_BLOCK
         min[i] = RMIN[i]+(RMAX[i]-RMIN[i])/4.0;
         max[i] = RMAX[i]-(RMAX[i]-RMIN[i])/4.0;
#else
         min[i] = RMIN[i];
         max[i] = RMAX[i];
#endif
      }
   }
#ifdef GRID_OF_DEM
   cout <<"adding block with min = "<<min[0]<<" "<<min[1]<<" "<<min[2]<<" and max = "<<max[0]<<" "<<max[1]<<" "<<max[2]<<endl; 
   Nmisc::addGridDEMparticles(ps,min,max,POROSITY);
#ifdef GRID_OF_DEM_PERT
   for (vector<Cparticle>::iterator i=ps.begin();i!=ps.end();i++) {
      if (i->iam==dem) {
         i->r[2] -= DEM_RADIUS*0.25*(1-cos(i->r[0]*2.0*PI/L))*(1-cos(i->r[1]*2.0*PI/L));
      }
   }
#endif
#else
   Nmisc::addRandomDEMparticles(data,min,max,POROSITY);
#endif
#else
   p.tag = ps.size()+1;
   p.r[0] = (RMAX[0]-RMIN[0])/2;
   p.r[1] = (RMAX[1]-RMIN[1])/2;
#ifdef IN_WATER
   p.r[2] = WMAX*0.8;
#else
   p.r[2] = WMAX+(RMAX[2]-RMIN[2])/8.0;
#endif
   p.dens = DEM_DENS;
   p.h = DEM_RADIUS;
   p.mass = DEM_VOL*DEM_DENS;
   p.v = 0.0;
   p.vhat = p.v;
   p.iam = dem;
   ps.push_back(p);
#endif



   const double totalDEMVol = (ps.size()-numSPH)*(4.0/3.0)*PI*pow(DEM_RADIUS,3);
   const double newLiqDens = DENS;
   //const double newLiqDens = DENS*((RMAX[1]-RMIN[1])*(RMAX[0]-RMIN[0])*(WMAX-RMIN[2])-totalDEMVol)/((RMAX[1]-RMIN[1])*(RMAX[0]-RMIN[0])*(WMAX-RMIN[2]));
   cout << "porosity = "<<1.0-totalDEMVol/((RMAX[0]-RMIN[0])*(RMAX[1]-RMIN[1])*(WMAX-RMIN[2]))<<endl;
   //cout << "after adding dem particles, new liquid density is "<<newLiqDens<<endl; 

   /*
#ifdef IN_WATER
   for (vector<Cparticle>::iterator i=ps.begin();i!=ps.end();i++) {
      if (i->iam==sph) {
         i->dens = newLiqDens;
         i->mass = pow(PSEP,NDIM)*newLiqDens;
      }
   }
#endif
   */

   cout << "Total number of particles = " << ps.size() << endl;


   vector<vector<double> > vprocDomain(globals.mpiSize);
   vector<Array<int,NDIM> > vprocNeighbrs(globals.mpiSize);
   vector<particleContainer > vps;
   vectInt split;
   split = 1,1,1;
   particleContainer pps;
   for (int i=0;i<ps.size();i++) {
      pps.push_back(ps[i]);
   }
   Nmisc::splitDomain(pps,split,vps,vprocDomain,vprocNeighbrs);


   cout << "Opening files for writing..."<<endl;
   Cio_data_vtk ioFile(filename.c_str(),&globals);
   cout << "Calculating Output stuff.."<<endl;
   //sph.calcOutputVars();
   //customOutput.calcOutput(0,&customSim,&ioFile);
   cout << "Writing Restart data to file..."<<endl;
   int nProc = product(split);
   for (int i=0;i<nProc;i++) {
      globals.mpiRank = i;
      for (int j=0;j<NDIM*2;j++)
         globals.procDomain[j] = vprocDomain[i][j];
      globals.procNeighbrs = vprocNeighbrs[i];
      ioFile.setFilename(filename.c_str(),&globals);
      ioFile.writeGlobals(0,&globals);
      ioFile.writeRestart(0,vps[i],&globals);
      ioFile.writeDomain(0,&globals);
      globals.mpiRank = 0;
   }
   //ioFile.writeGlobals(0,&globals);
   //ioFile.writeDomain(0,vprocDomain,vprocNeighbrs);

}
コード例 #8
0
ファイル: setup.cpp プロジェクト: LingDu-san/SPH-DEM
int main(int argc, char *argv[]) {
   if (argc != 2) {
      cout << "Usage: setup outfilename" << endl;
      return(-1);
   }
   string filename = argv[1];

   vector<Cparticle> ps;
   Cparticle p;
   cout << "Creating box with sides: rmax = ["<<RMAX[0]<<" "<<RMAX[1]<<"] rmin = ["<<RMIN[0]<<" "<<RMIN[1]<<"]"<<endl;
   cout << "Reynolds Number = "<<REYNOLDS_NUMBER<<endl;
   cout << "Density = "<<DENS<<endl;
   cout << "number of particles on side = "<<NX<<endl;
   cout << "alpha = "<<ALPHA<<endl;
   cout << "viscosity = "<<VISCOSITY<<endl;
   cout << "maxtime = "<<MAXTIME<<endl;
 
   double tsc = Nsph::courantCondition(H,2*SPSOUND);
   double tsv = Nsph::viscDiffusionCondition(H,VISCOSITY);
   cout <<"simulation will take "<<int((MAXTIME/tsc)+1)<<" steps according to Courant condition, "<<int((MAXTIME/tsv)+1)<<" steps according to visc diffusion condition"<<endl;


   for (int i=-3;i<=NX+3;i++) {
         cout << "\rParticle ("<<i<<","<<"0"<<"). Generation "<<((i+2)*(NY+4))/double((NX+4)*(NY+4))*100<<"\% complete"<<flush;
      for (int j=-3;j<=NY+3;j++) {
         p.tag = ps.size()+1;
         p.r = (i+0.5)*PSEP+RMIN[0],(j+0.5)*PSEP+RMIN[1];
         p.dens = DENS;
         p.mass = PSEP*PSEP*DENS;
         p.h = H;
         if ((j<=0)||(j>=NY)||(i<=0)||(i>=NX)) {
            p.v = 0,0;
            p.iam = sphBoundary;
         } else {
            p.v = 0.25*(p.r[1]-0.5),0.25*(0.5-p.r[0]);
            p.iam = sph;
         }
         p.alpha = ALPHA;
         ps.push_back(p);
      }
   }


   cout << "Total number of particles = " << ps.size() << endl;

   CglobalVars globals;


   vector<vector<double> > vprocDomain(globals.mpiSize);
   vector<Array<int,NDIM> > vprocNeighbrs(globals.mpiSize);
   vector<particleContainer > vps;
   vectInt split;
   split = 1,1;
   particleContainer pps;
   for (int i=0;i<ps.size();i++) {
      pps.push_back(ps[i]);
   }
   Nmisc::splitDomain(pps,split,vps,vprocDomain,vprocNeighbrs);



   //CdataLL *data = new CdataLL(ps,globals);
   //CsphIncompress sph(data);
   //CcustomOutput customOutput(data);
   //CcustomSim customSim(data,globals.time);


   cout << "Opening files for writing..."<<endl;
   Cio_data_vtk ioFile(filename.c_str(),&globals);
   cout << "Calculating Output stuff.."<<endl;
   //sph.calcOutputVars();
   //customOutput.calcOutput(0,&customSim,&ioFile);
   cout << "Writing Restart data to file..."<<endl;
   int nProc = product(split);
   for (int i=0;i<nProc;i++) {
      globals.mpiRank = i;
      ioFile.setFilename(filename.c_str(),&globals);
      ioFile.writeGlobals(0,&globals);
      ioFile.writeRestart(0,vps[i],&globals);
      globals.mpiRank = 0;
   }
   cout << "Writing Global data to file..."<<endl;
   //ioFile.writeGlobals(0,&globals);
   ioFile.writeDomain(0,vprocDomain,vprocNeighbrs);


   //Write restart file for John
   /*ofstream fo("restartJohn.dat");
   fo <<"h = "<<H<<" mass = "<<ps[0].mass<<" dens = "<<ps[0].dens<<" psep = "<<PSEP<<" Re = "<<REYNOLDS_NUMBER<<" kinematic viscosity = "<<VISCOSITY<<" n = "<<ps.size()<<endl;
   fo <<"r_x r_y v_x v_y flag(0=fluid,1=boundary)"<<endl;
   for (int i=0;i<ps.size();i++) {
      fo << ps[i].r[0]<<' '<<ps[i].r[1]<<' '<<ps[i].v[0]<<' '<<ps[i].v[1]<<' '<<ps[i].iam<<endl;
   }*/

}
コード例 #9
0
ファイル: setup.cpp プロジェクト: LingDu-san/SPH-DEM
int main(int argc, char *argv[]) {
   if (argc != 2) {
      cout << "Usage: setup outfilename" << endl;
      return(-1);
   }
   string filename = argv[1];

   vector<Cparticle> ps;
   Cparticle p;
   cout << "Creating box with sides: rmax = ["<<RMAX[0]<<" "<<RMAX[1]<<"] rmin = ["<<RMIN[0]<<" "<<RMIN[1]<<"]"<<endl;
   cout << "Reynolds Number = "<<REYNOLDS_NUMBER<<endl;
   cout << "Density = "<<DENS<<endl;
   cout << "number of particles on side = "<<NX<<endl;
   cout << "alpha = "<<ALPHA<<endl;
   cout << "viscosity = "<<VISCOSITY<<endl;
   cout << "maxtime = "<<MAXTIME<<endl;
 
   double tsc = Nsph::courantCondition(H,2*SPSOUND);
   double tsv = Nsph::viscDiffusionCondition(H,VISCOSITY);
   cout <<"simulation will take "<<int((MAXTIME/tsc)+1)<<" steps according to Courant condition, "<<int((MAXTIME/tsv)+1)<<" steps according to visc diffusion condition"<<endl;


   gsl_rng *rng = gsl_rng_alloc(gsl_rng_ranlxd1);
   gsl_rng_set(rng,1);
   //gsl_rng_set(rng,time(NULL));
   for (int i=0;i<NX;i++) {
         cout << "\rParticle ("<<i<<","<<"0"<<"). Generation "<<((i+2)*(NY+4))/double((NX+4)*(NY+4))*100<<"\% complete"<<flush;
      for (int j=0;j<NY;j++) {
         p.tag = ps.size()+1;
         p.r = (i+0.5)*PSEP+RMIN[0],(j+0.5)*PSEP+RMIN[1];
         p.dens = DENS;
         p.mass = PSEP*PSEP*DENS;
         p.h = H;
         p.v = -VREF*cos(2.0*PI*p.r[0])*sin(2.0*PI*p.r[1]),VREF*sin(2.0*PI*p.r[0])*cos(2.0*PI*p.r[1]);
         p.v[0] += gsl_ran_gaussian(rng,VREF/20);
         p.v[1] += gsl_ran_gaussian(rng,VREF/20);
         p.v[2] += gsl_ran_gaussian(rng,VREF/20);
         p.vhat = p.v;
         p.iam = sph;
         ps.push_back(p);
      }
   }


   cout << "Total number of particles = " << ps.size() << endl;

   CglobalVars globals;


   vector<vector<double> > vprocDomain(globals.mpiSize);
   vector<Array<int,NDIM> > vprocNeighbrs(globals.mpiSize);
   vector<particleContainer > vps;
   vectInt split;
   split = 1,1;
   particleContainer pps;
   for (int i=0;i<ps.size();i++) {
      pps.push_back(ps[i]);
   }
   Nmisc::splitDomain(pps,split,vps,vprocDomain,vprocNeighbrs);
   cout << "Opening files for writing..."<<endl;

   Cio_data_vtk ioFile(filename.c_str(),&globals);

   cout << "Writing Restart data to file..."<<endl;
   int nProc = product(split);
   for (int i=0;i<nProc;i++) {
      globals.mpiRank = i;
      for (int j=0;j<NDIM*2;j++)
         globals.procDomain[j] = vprocDomain[i][j];
      globals.procNeighbrs = vprocNeighbrs[i];
      ioFile.setFilename(filename.c_str(),&globals);
      ioFile.writeGlobals(0,&globals);
      ioFile.writeRestart(0,vps[i],&globals);
      ioFile.writeDomain(0,&globals);
      globals.mpiRank = 0;
   }


}
コード例 #10
0
ファイル: setup.cpp プロジェクト: LingDu-san/SPH-DEM
int main(int argc, char *argv[]) {
   if (argc != 2) {
      cout << "Usage: setup outfilename" << endl;
      return(-1);
   }
   string filename = argv[1];

   vector<Cparticle> ps;
   Cparticle p;
   cout << "Creating box with sides: rmax = ["<<BMAX[0]<<" "<<BMAX[1]<<"] rmin = ["<<BMIN[0]<<" "<<BMIN[1]<<"]"<<endl;
   cout << "Reynolds Number = "<<REYNOLDS_NUMBER<<endl;
   cout << "Density = "<<DENS<<endl;
   cout << "speed of sound = "<<SPSOUND<<endl;
   cout << "prb = "<<PRB<<endl;
   cout << "number of particles on side = "<<NX<<endl;
   cout << "max num partilces = "<<MAX_NUM_PARTICLES_PER_CPU<<endl;
   cout << "sph boundary density is "<<SPHBOUNDARYDENS<<endl;
   cout << "VMAX is "<<VMAX<<endl;

   cout << "PSEP = "<<PSEP<<endl;
   cout << "alpha = "<<ALPHA<<endl;
   cout << "viscosity = "<<VISCOSITY<<endl;
   cout << "maxtime = "<<MAXTIME<<endl;
   cout << "term vel (3d) is "<<VREF<<endl;
   cout << "term vel (stokes) is "<<(2.0/9.0)*(DEM_DENS-DENS)*9.81*pow(DEM_RADIUS,2)/(VISCOSITY*DENS)<<endl;
   cout << "DEM_RADIUS = "<<DEM_RADIUS<<endl;
   cout << "Other dens = "<<D2<<endl;
   cout << "dens drop= "<<DENS_DROP[0]<<endl;
 
   double tsc = Nsph::courantCondition(H,2*SPSOUND);
   double tsv = Nsph::viscDiffusionCondition(H,VISCOSITY);
   double tdem = Nsph::demCondition();
   cout <<"dem ts = "<<tdem<<endl;
   cout <<"simulation will take "<<int((MAXTIME/tsc)+1)<<" steps according to Courant condition, "<<int((MAXTIME/tsv)+1)<<" steps according to visc diffusion condition"<<int((MAXTIME/tdem)+1)<<" steps according to the DEM condition"<<endl;

   for (int i=0;i<NX;i++) {
         cout << "\rParticle ("<<i<<","<<"0"<<"). Generation "<<((i+2)*(NY+4))/double((NX+4)*(NY+4))*100<<"\% complete"<<flush;
      for (int j=0;j<NY;j++) {
         for (int k=0;k<NZ;k++) {
            p.tag = ps.size()+1;
            p.r = (i+0.5)*PSEP+RMIN[0],(j+0.5)*PSEP+RMIN[1],(k+0.5)*PSEP+RMIN[2];
            if (p.tag==11) cout <<p.r<<endl;
            p.dens = DENS;
            p.mass = pow(PSEP,NDIM)*DENS;
            p.h = HFAC*pow(p.mass/p.dens,1.0/NDIM);
            p.v = 0.0;
            p.vhat = p.v;
            ps.push_back(p);
         }
      }
   }
   int numSPH = ps.size();

   CglobalVars globals;
   globals.procNeighbrs = 0;
   globals.procNeighbrs(1,1,1) = -1;
   for (int j=0;j<NDIM;j++) {
      if (!PERIODIC[j]) {
         globals.procDomain[2*j] = RMIN[j]-0.25*(RMAX[j]-RMIN[j]);
      } else {
         globals.procDomain[2*j] = RMIN[j];
      }
      if (!PERIODIC[j]) {
         globals.procDomain[2*j+1] = RMAX[j]+0.25*(RMAX[j]-RMIN[j]);
      } else {
         globals.procDomain[2*j+1] = RMAX[j];
      }
   }
   MPI_Init(&argc, &argv);
   MPI_Comm_size(MPI_COMM_WORLD, &(globals.mpiSize));
   MPI_Comm_rank(MPI_COMM_WORLD, &(globals.mpiRank));
   ps.reserve(MAX_NUM_PARTICLES_PER_CPU);
   cout <<"creating new data structure"<<endl;
   CdataLL *data = new CdataLL(ps,globals,true);
   cout <<"adding dem particles"<<endl;
#ifdef MANY_PARTICLES
   double min[3];
   double max[3];
   for (int i=0;i<3;i++) {
      if (i==2) {
         min[i] = RMIN[i];
         max[i] = RMAX[i];
      } else {
         min[i] = RMIN[i];
         max[i] = RMAX[i];
      }
   }
#ifdef GRID_OF_DEM
   Nmisc::addGridDEMparticles(ps,min,max,POROSITY);
#else
   Nmisc::addRandomDEMparticles(data,min,max,POROSITY);
#endif
#else
   p.tag = ps.size()+1;
   p.r[0] = (RMAX[0]-RMIN[0])/2;
   p.r[1] = (RMAX[1]-RMIN[1])/2;
   p.r[2] = RMAX[2]-4.0*PSEP;
   p.dens = DEM_DENS;
   p.h = DEM_RADIUS;
   p.mass = DEM_VOL*DEM_DENS;
   p.v = 0.0;
   p.vhat = p.v;
   p.iam = dem;
   ps.push_back(p);
#endif



   const double totalDEMVol = (ps.size()-numSPH)*(4.0/3.0)*PI*pow(DEM_RADIUS,3);
   //const double newLiqDens = DENS;
   const double newLiqDens = DENS*((RMAX[1]-RMIN[1])*(RMAX[0]-RMIN[0])*(RMAX[2]-RMIN[2])-totalDEMVol)/((RMAX[1]-RMIN[1])*(RMAX[0]-RMIN[0])*(RMAX[2]-RMIN[2]));
   cout << "porosity = "<<1.0-totalDEMVol/((RMAX[0]-RMIN[0])*(RMAX[1]-RMIN[1])*(RMAX[2]-RMIN[2]))<<endl;
   cout << "after adding dem particles, new liquid density is "<<newLiqDens<<endl; 

   for (vector<Cparticle>::iterator i=ps.begin();i!=ps.end();i++) {
      if (i->iam==sph) {
         i->dens = newLiqDens;
         i->mass = pow(PSEP,NDIM)*newLiqDens;
      }
   }


   cout << "Total number of particles = " << ps.size() << endl;


   vector<vector<double> > vprocDomain(globals.mpiSize);
   vector<Array<int,NDIM> > vprocNeighbrs(globals.mpiSize);
   vector<particleContainer > vps;
   vectInt split;
   split = 1,1,1;
   particleContainer pps;
   for (int i=0;i<ps.size();i++) {
      pps.push_back(ps[i]);
   }
   Nmisc::splitDomain(pps,split,vps,vprocDomain,vprocNeighbrs);


   cout << "Opening files for writing..."<<endl;
   Cio_data_vtk ioFile(filename.c_str(),&globals);
   cout << "Calculating Output stuff.."<<endl;
   //sph.calcOutputVars();
   //customOutput.calcOutput(0,&customSim,&ioFile);
   cout << "Writing Restart data to file..."<<endl;
   int nProc = product(split);
   for (int i=0;i<nProc;i++) {
      globals.mpiRank = i;
      for (int j=0;j<NDIM*2;j++)
         globals.procDomain[j] = vprocDomain[i][j];
      globals.procNeighbrs = vprocNeighbrs[i];
      ioFile.setFilename(filename.c_str(),&globals);
      ioFile.writeGlobals(0,&globals);
      ioFile.writeRestart(0,vps[i],&globals);
      ioFile.writeDomain(0,&globals);
      globals.mpiRank = 0;
   }
   //ioFile.writeGlobals(0,&globals);
   //ioFile.writeDomain(0,vprocDomain,vprocNeighbrs);

}
コード例 #11
0
ファイル: setup.cpp プロジェクト: LingDu-san/SPH-DEM
int main(int argc, char *argv[]) {
   if (argc != 2) {
      cout << "Usage: setup outfilename" << endl;
      return(-1);
   }
   string filename = argv[1];

   vector<Cparticle> ps;
   Cparticle p;
   cout << "Creating box with sides: rmax = ["<<RMAX[0]<<" "<<RMAX[1]<<"] rmin = ["<<RMIN[0]<<" "<<RMIN[1]<<"]"<<endl;
   cout << "Reynolds Number = "<<REYNOLDS_NUMBER<<endl;
   cout << "Density = "<<DENS<<endl;
   cout << "number of particles on side = "<<NX<<endl;
   cout << "alpha = "<<ALPHA<<endl;
   cout << "viscosity = "<<VISCOSITY<<endl;
   cout << "maxtime = "<<MAXTIME<<endl;
 
   double tsc = Nsph::courantCondition(H,2*SPSOUND);
   double tsv = Nsph::viscDiffusionCondition(H,VISCOSITY);
   cout <<"simulation will take "<<int((MAXTIME/tsc)+1)<<" steps according to Courant condition, "<<int((MAXTIME/tsv)+1)<<" steps according to visc diffusion condition"<<endl;

   for (int i=0;i<NX;i++) {
         cout << "\rParticle ("<<i<<","<<"0"<<"). Generation "<<((i+2)*(NY+4))/double((NX+4)*(NY+4))*100<<"\% complete"<<flush;
      for (int j=-3;j<=NY+3;j++) {
         p.tag = ps.size()+1;
         p.r = i*PSEP+RMIN[0],j*PSEP+RMIN[1];
         p.dens = DENS;
         p.mass = PSEP*PSEP*DENS;
         p.h = H;
         p.v = 0,0;
         p.vhat = p.v;

         if (j<=0) {
            p.iam = sphBoundary;
            p.norm1[0] = 0;
            p.norm1[1] = -j*PSEP;
            p.dist = len(p.norm1);
            if (p.dist==0) {
               p.norm1[1] = 1.0;
            } else {
               p.norm1 = p.norm1/p.dist;
            }
            p.v[0] = WALL_SPEED;
            p.vhat = p.v;
         } else if (j>=NY) {
            p.iam = sphBoundary;
            p.norm1[0] = 0;
            p.norm1[1] = (NY-j)*PSEP;
            p.dist = len(p.norm1);
            if (p.dist==0) {
               p.norm1[1] = -1.0;
            } else {
               p.norm1 = p.norm1/p.dist;
            }
         } else {
            p.iam = sph;
            //p.v[0] += gsl_cheb_eval(csX,p.r[0]);
            //p.v[1] += gsl_cheb_eval(csY,p.r[1]);
         }
         p.alpha = ALPHA;
         ps.push_back(p);
      }
   }

   cout << "Total number of particles = " << ps.size() << endl;

   CglobalVars globals;


   vector<vector<double> > vprocDomain(globals.mpiSize);
   vector<Array<int,NDIM> > vprocNeighbrs(globals.mpiSize);
   vector<particleContainer > vps;
   vectInt split;
   split = 1,1;
   particleContainer pps;
   for (int i=0;i<ps.size();i++) {
      pps.push_back(ps[i]);
   }
   Nmisc::splitDomain(pps,split,vps,vprocDomain,vprocNeighbrs);



   //CdataLL *data = new CdataLL(ps,globals);
   //CsphIncompress sph(data);
   //CcustomOutput customOutput(data);
   //CcustomSim customSim(data,globals.time);


   cout << "Opening files for writing..."<<endl;
   Cio_data_vtk ioFile(filename.c_str(),&globals);
   cout << "Calculating Output stuff.."<<endl;
   //sph.calcOutputVars();
   //customOutput.calcOutput(0,&customSim,&ioFile);
   cout << "Writing Restart data to file..."<<endl;
   int nProc = product(split);
   for (int i=0;i<nProc;i++) {
      globals.mpiRank = i;
      ioFile.setFilename(filename.c_str(),&globals);
      ioFile.writeGlobals(0,&globals);
      ioFile.writeRestart(0,vps[i],&globals);
      globals.mpiRank = 0;
   }
   cout << "Writing Global data to file..."<<endl;
   //ioFile.writeGlobals(0,&globals);
   ioFile.writeDomain(0,vprocDomain,vprocNeighbrs);

}
コード例 #12
0
ファイル: setup.cpp プロジェクト: xyuan/SPH-DEM
int main(int argc, char *argv[]) {
    if (argc != 2) {
        cout << "Usage: setup outfilename" << endl;
        return(-1);
    }
    string filename = argv[1];

    vector<Cparticle> ps;
    Cparticle p;
    cout << "Creating box with sides: rmax = ["<<BMAX[0]<<" "<<BMAX[1]<<"] rmin = ["<<BMIN[0]<<" "<<BMIN[1]<<"]"<<endl;
    cout << "Reynolds Number = "<<REYNOLDS_NUMBER<<endl;
    cout << "Density = "<<DENS<<endl;
    cout << "speed of sound = "<<SPSOUND<<endl;
    cout << "prb = "<<PRB<<endl;
    cout << "number of particles on side = "<<NX<<endl;
    cout << "max num partilces = "<<MAX_NUM_PARTICLES_PER_CPU<<endl;
    cout << "this run will need "<<MAX_NUM_PARTICLES_PER_CPU*sizeof(Cparticle)<<" bytes"<<endl;
    cout <<"inlet vel is "<<INFLOW_VEL<<endl;

    cout << "PSEP = "<<PSEP<<endl;
    cout << "alpha = "<<ALPHA<<endl;
    cout << "viscosity = "<<VISCOSITY<<endl;
    cout << "maxtime = "<<MAXTIME<<endl;
    cout << "term vel (3d) is "<<(2.0/9.0)*(DEM_DENS-DENS)*9.81*pow(DEM_RADIUS,2)/(VISCOSITY*DENS)<<endl;
    cout << "term vel (2d) is "<<(1.0/3.0)*(DEM_DENS-DENS)*9.81*pow(DEM_RADIUS,2)/(VISCOSITY*DENS)<<endl;
    //cout << "term vel is "<<(1.0/6.0)*(DEM_DENS-DENS)*9.81*pow(DEM_RADIUS,1)/(VISCOSITY*DENS)<<endl;

    cout << "gamma must be less than" <<2.0*sqrt(DEM_K*DEM_MIN_REDUCED_MASS)<<endl;
#ifdef LUBRICATION
    cout << "k must be greater than" <<pow(0.5*LUB_GAMMA,2)/DEM_MIN_REDUCED_MASS<<endl;
#else
    cout << "k must be greater than" <<pow(0.5*DEM_GAMMA,2)/DEM_MIN_REDUCED_MASS<<endl;
#endif
    cout << "Konmr ="<<Konmr<<endl;
    cout << "gammaOnmr = "<<gammaOnmr<<endl;
    cout << "K = "<<DEM_K<<endl;
#ifdef LUBRICATION
    cout << "GAMMA  = "<<LUB_GAMMA<<endl;
#else
    cout << "GAMMA  = "<<DEM_GAMMA<<endl;
#endif


    cout <<"THETS ="<<THETS<<endl;
    cout <<"DEM_TIMESTEP="<<DEM_TIMESTEP<<endl;
    cout <<"CR = "<<CR<<endl;


    double tsc = Nsph::courantCondition(H,2*SPSOUND);
    double tsv = Nsph::viscDiffusionCondition(H,VISCOSITY);
    double tdem = Nsph::demCondition();
#ifdef LUBRICATION
    cout <<"coeff of restitution = "<<exp(-tdem*0.5*LUB_GAMMA/DEM_MIN_REDUCED_MASS)<<endl;
#else
    cout <<"coeff of restitution = "<<exp(-tdem*0.5*DEM_GAMMA/DEM_MIN_REDUCED_MASS)<<endl;
#endif
    double liqtdem = Nsph::liqDemCondition();
    cout <<"dem ts = "<<tdem<<endl;
    cout <<"liq dem ts = "<<liqtdem<<endl;
    cout <<"simulation will take "<<int((MAXTIME/tsc)+1)<<" steps according to Courant condition, "<<int((MAXTIME/tsv)+1)<<" steps according to visc diffusion condition"<<int((MAXTIME/tdem)+1)<<" steps according to the DEM condition"<<int((MAXTIME/liqtdem)+1)<<" steps according to the LIQ DEM condition"<<endl;

    cout <<"reduced mass = "<<DEM_MIN_REDUCED_MASS<<endl;
    cout <<" tdem = "<< (1.0/50.0)*PI*sqrt(DEM_MIN_REDUCED_MASS)/sqrt(DEM_K-pow(0.5*DEM_GAMMA,2)/DEM_MIN_REDUCED_MASS) << endl;
    cout <<"particle reynolds number = "<<2.0*DEM_RADIUS*INFLOW_VEL/VISCOSITY<<endl;
    vect normal = 0.0;
    normal[2] = 1.0;
    Nmisc::boundaryCircle(ps,CYLINDER_ORIGIN,INLET_RADIUS,CYLINDER_RADIUS,normal);
    vect newOrigin = CYLINDER_ORIGIN;
    const double newHeight = CYLINDER_HEIGHT - BFAC*PSEP;
    newOrigin[2] += BFAC*PSEP;
    cout <<"adding cylinder at origin"<<newOrigin<<endl;
    Nmisc::boundaryCylinderNoTopBottom(ps,newOrigin,CYLINDER_RADIUS,newHeight);
    newOrigin[2] = CYLINDER_ORIGIN[2]-INLET_HEIGHT;
    cout <<"adding cylinder at origin"<<newOrigin<<endl;
    Nmisc::boundaryCylinderNoTopBottom(ps,newOrigin,INLET_RADIUS,INLET_HEIGHT);
    newOrigin[2] = CYLINDER_ORIGIN[2]+CYLINDER_HEIGHT;
    normal[2] = -1.0;
    cout <<"adding cylinder at origin"<<newOrigin<<endl;
    Nmisc::boundaryCircle(ps,newOrigin,INLET_RADIUS,CYLINDER_RADIUS,normal);
    newOrigin[2] += PSEP;
    cout <<"adding cylinder at origin"<<newOrigin<<endl;
    Nmisc::boundaryCylinderNoTopBottom(ps,newOrigin,INLET_RADIUS,INLET_HEIGHT);
    //demPorousCylinder(ps,CYLINDER_ORIGIN,CYLINDER_RADIUS,DEM_DISK_HEIGHT,DEM_DISK_POROSITY);
    newOrigin[2] = CYLINDER_ORIGIN[2]+CYLINDER_HEIGHT-DEM_DISK_HEIGHT;
    //demPorousCylinder(ps,newOrigin,CYLINDER_RADIUS,DEM_DISK_HEIGHT,0.5);


    CglobalVars globals;
    globals.procNeighbrs = -1;
    for (int j=0; j<NDIM; j++) {
        globals.procDomain[2*j] = RMIN[j]-0.25*(RMAX[j]-RMIN[j]);
        globals.procDomain[2*j+1] = RMAX[j]+0.25*(RMAX[j]-RMIN[j]);
    }
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &(globals.mpiSize));
    MPI_Comm_rank(MPI_COMM_WORLD, &(globals.mpiRank));
    ps.reserve(MAX_NUM_PARTICLES_PER_CPU);
    cout <<"creating new data structure"<<endl;
    CdataLL *data = new CdataLL(ps,globals,true);
#ifdef LIQ_DEM
    cout <<"adding dem particles"<<endl;

    cout <<"going to add "<<NDEM<<" dem particles at random locations...."<<endl;
    newOrigin[2] = CYLINDER_ORIGIN[2]+DEM_DISK_HEIGHT+2.0*DEM_RADIUS;
    cout <<"adding cylinder at origin"<<newOrigin<<endl;
    Nmisc::addRandomDEMparticlesCyl(data,newOrigin,CYLINDER_RADIUS-2.0*DEM_RADIUS,CYLINDER_HEIGHT-4.0*DEM_RADIUS-2*DEM_DISK_HEIGHT,NDEM);
#endif
    //newOrigin = CYLINDER_ORIGIN;
    //origin[2] += 1.6*PSEP;
    //Nmisc::sphCylinder(ps,origin);
#ifdef WET_START
    const double totalDEMVol = NDEM*(4.0/3.0)*PI*pow(DEM_RADIUS,3);
    //const double newLiqDens = DENS;
    const double liqVol = PI*pow(CYLINDER_RADIUS,2)*CYLINDER_HEIGHT*0.90;
    //const double newLiqDens = DENS*(liqVol-totalDEMVol)/(liqVol);
    const double newLiqDens = DENS;
    cout << "porosity = "<<1.0-totalDEMVol/(liqVol)<<endl;
    cout << "after adding dem particles, new liquid density is "<<newLiqDens<<endl;

    cout <<"adding liquid particles"<<endl;
    for (int i=0; i<2*NX+3; i++) {
        cout << "\rParticle ("<<i<<","<<"0"<<"). Generation "<<((i+2)*(NY+4))/double((NX+4)*(NY+4))*100<<"\% complete"<<flush;
        for (int j=0; j<2*NY+3; j++) {
            for (int k=0; k<=NZ; k++) {
                p.tag = ps.size()+1;
                p.r = (i)*PSEP+BMIN[0],j*PSEP+BMIN[1],(k+1)*PSEP+CYLINDER_ORIGIN[2];
                if ((p.r[2]<CYLINDER_ORIGIN[2])||(p.r[0]*p.r[0]+p.r[1]*p.r[1]>pow(CYLINDER_RADIUS-PSEP,2))) continue;
                p.dens = newLiqDens;
                p.mass = pow(PSEP,NDIM)*newLiqDens;
                p.h = HFAC*pow(p.mass/p.dens,1.0/NDIM);
                p.v = 0.0;
                p.vhat = p.v;
                p.iam = sph;
                ps.push_back(p);
            }
        }
    }

    for (int k=0; k<int(INLET_HEIGHT/PSEP)+1; k++) {
        vect tmp = CYLINDER_ORIGIN;
        tmp[2] -= INLET_HEIGHT-k*PSEP;
        if (k<4) {
            myBoundaryCircle(ps,tmp,0,int((INLET_RADIUS-1.4*PSEP)/PSEP)*PSEP,sphBoundary);
        } else {
            myBoundaryCircle(ps,tmp,0,int((INLET_RADIUS-1.4*PSEP)/PSEP)*PSEP,sph);
        }
    }

#endif
    /*
    p.tag = ps.size()+1;
    p.r = CYLINDER_ORIGIN;
    p.r[2] = CYLINDER_HEIGHT;
    p.dens = DEM_DENS;
    p.h = DEM_RADIUS/2;
    p.mass = (4.0/3.0)*PI*pow(DEM_RADIUS,3)*DEM_DENS;
    p.v = 0.0;
    p.vhat = p.v;
    p.iam = dem;
    //ps.push_back(p);
    */

    cout << "Total number of particles = " << ps.size() << endl;

    //CglobalVars globals;

    vector<vector<double> > vprocDomain(globals.mpiSize);
    vector<Array<int,NDIM> > vprocNeighbrs(globals.mpiSize);
    vector<particleContainer > vps;
    vectInt split;
    split = NCPU_X,NCPU_Y,NCPU_Z;
    particleContainer pps;
    for (int i=0; i<ps.size(); i++) {
        pps.push_back(ps[i]);
    }
    Nmisc::splitDomain(pps,split,vps,vprocDomain,vprocNeighbrs);


    cout << "Opening files for writing..."<<endl;
    Cio_data_vtk ioFile(filename.c_str(),&globals);
    cout << "Calculating Output stuff.."<<endl;
    //sph.calcOutputVars();
    //customOutput.calcOutput(0,&customSim,&ioFile);
    cout << "Writing Restart data to file..."<<endl;
    int nProc = product(split);
    for (int i=0; i<nProc; i++) {
        globals.mpiRank = i;
        for (int j=0; j<NDIM*2; j++)
            globals.procDomain[j] = vprocDomain[i][j];
        globals.procNeighbrs = vprocNeighbrs[i];
        ioFile.setFilename(filename.c_str(),&globals);
        ioFile.writeGlobals(0,&globals);
        ioFile.writeRestart(0,vps[i],&globals);
        ioFile.writeDomain(0,&globals);
        globals.mpiRank = 0;
    }
    //ioFile.writeGlobals(0,&globals);
    //ioFile.writeDomain(0,vprocDomain,vprocNeighbrs);

}