Foam::tmp<Foam::volVectorField>
Foam::wallLubricationModels::TomiyamaWallLubrication::Fi() const
{
    volVectorField Ur(pair_.Ur());

    const volVectorField& n(nWall());
    const volScalarField& y(yWall());

    volScalarField Eo(pair_.Eo());

    return
        (
            pos(Eo - 1.0)*neg(Eo - 5.0)*exp(-0.933*Eo + 0.179)
          + pos(Eo - 5.0)*neg(Eo - 33.0)*(0.00599*Eo - 0.0187)
          + pos(Eo - 33.0)*0.179
        )
       *0.5
       *pair_.dispersed().d()
       *(
            1/sqr(y)
          - 1/sqr(D_ - y)
        )
       *pair_.continuous().rho()
       *magSqr(Ur - (Ur & n)*n)
       *n;
}
Beispiel #2
0
Foam::tmp<Foam::volScalarField> Foam::phasePair::EoH1() const
{
    return
        EoH
        (
            dispersed().d()
           *cbrt(1 + 0.163*pow(Eo(), 0.757))
        );
}
Foam::tmp<Foam::volScalarField>
Foam::dragModels::TomiyamaKataokaZunSakaguchi::CdRe() const
{
    volScalarField Re(pair_.Re());
    volScalarField Eo(max(pair_.Eo(), residualEo_));

    return
        max
        (
            24*(1 + 0.15*pow(Re, 0.687))/max(Re, residualRe_),
            8*Eo/(3*(Eo + 4.0))
        )
       *max(pair_.Re(), residualRe_);
}
Foam::tmp<Foam::volScalarField>
Foam::dragModels::TomiyamaAnalytic::CdRe() const
{
    volScalarField Eo(max(pair_.Eo(), residualEo_));
    volScalarField E(max(pair_.E(), residualE_));

    volScalarField OmEsq(max(scalar(1) - sqr(E), sqr(residualE_)));
    volScalarField rtOmEsq(sqrt(OmEsq));

    volScalarField F(max(asin(rtOmEsq) - E*rtOmEsq, residualE_)/OmEsq);

    return
        (8.0/3.0)
       *Eo
       /(
            Eo*pow(E, 2.0/3.0)/OmEsq
          + 16*pow(E, 4.0/3.0)
        )
       /sqr(F)
       *max(pair_.Re(), residualRe_);
}
Foam::tmp<Foam::volScalarField>
Foam::microDragClosures::IshiiZuber::CdRe() const
{
    volScalarField Re(pair_.Re());
    volScalarField Eo(pair_.Eo());

    volScalarField mud(pair_.dispersed().mu());
    volScalarField muc(pair_.continuous().mu());

    volScalarField muStar((mud + 0.4*muc)/(mud + muc));

    volScalarField muMix
    (
        muc
       *pow(max(1 - pair_.dispersed(), scalar(1e-3)), -2.5*muStar)
    );

    volScalarField ReM(Re*muc/muMix);
    volScalarField CdRe
    (
        pos(1000 - ReM)*24.0*(scalar(1) + 0.15*pow(ReM, 0.687))
      + neg(1000 - ReM)*0.44*ReM
    );

    volScalarField F((muc/muMix)*sqrt(1 - pair_.dispersed()));
    F.max(1e-3);

    volScalarField Ealpha((1 + 17.67*pow(F, 0.8571428))/(18.67*F));

    volScalarField CdReEllipse(Ealpha*0.6666*sqrt(Eo)*Re);

    return
        pos(CdReEllipse - CdRe)
       *min(CdReEllipse, Re*sqr(1 - pair_.dispersed())*2.66667)
      + neg(CdReEllipse - CdRe)*CdRe;
}
Beispiel #6
0
int main (int argc, char **argv)
{
#if defined(_DIST_)
    CnC::dist_cnc_init< HeatEquation_bl_context > AAA;
#endif
    //    CnC::debug::set_num_threads(1);
    tbb::tick_count t0 = tbb::tick_count::now();
    if( argc < 3 ) {
        std::cerr << "expecting 2 arguments: <file> <blocksize>\n";
        exit( 1 );
    }

    global_data d;
    int& block_size = d.block_size;
    int& Nx = d.Nx;
    int& Nt = d.Nt;
    int& N_bl = d.N_bl;
    double& Xa = d.Xa;
    double& Xb = d.Xb;
    double& T0 = d.T0;
    double& T1 = d.T1;
    double& k = d.k;
    double& hx = d.hx;
    double& ht = d.ht;

    block_size = atoi(argv[2]);
    if(block_size < 1) {
        std::cerr<<"Bad block size\n";
        return 0;
    }

    {
        std::ifstream from(argv[1]);
        if( ! from ) {
            std::cerr << "couldn't open " << argv[1] << std::endl;
            exit( 2 );
        }
        from >> d.Xa >> d.Xb >> d.Nx >> d.T0 >> d.T1 >> d.Nt >> d.k;
        from.close();
    }


    if( block_size > Nx+1 ) {
        block_size = Nx+1;
    } else {
        Nx = ((Nx+1+block_size-1)/block_size)*block_size-1;
    }

    HeatEquation_bl_context c;

    hx = ( Xb - Xa ) / Nx;
    ht = ( T1 - T0 ) / Nt;
    //    for ( int i = 0; i < Nx + 1; i++ ) { c.X.put(i,Xa+i*hx); }
    //    for ( int i = 0; i < Nt + 1; i++ ) { c.T.put(i,T0+i*ht); }

    N_bl = (Nx+1) / block_size;

    c.gd.put(0,d);

    for ( int i = 0; i < N_bl; i++ ) {
        my_array<double> z(block_size);
        for(int j = 0; j < block_size; j++ ){
            double x = calc_x(block_size*i+j,Xa,Xb,Nx);
            z.data[j] = Analitical( x, T0 );
        }
        c.H.put(Pair(0,i),z);
    }

    Pair p;
    p.It = 1;
    for ( int j = 0; j < N_bl; j++ ) {
        p.Jx = j;
        c.Tag.put( p );
    }

    // Wait for all steps to finish
    c.wait();
    tbb::tick_count t1 = tbb::tick_count::now();
    std::cout<<"Time taken: "<< (t1-t0).seconds()<<" \n";

    if (argc >= 4){
        for (int i = 0; i <= Nt; i++)
            {
            for (int j = 0; j < N_bl; j++){
                my_array<double> z;
                c.H.get(Pair(i,j),z);
                for (int k = j*block_size; k < j*block_size+block_size && k <= Nx; k++){
                    printf("%.6lf ",double(z.data[k-j*block_size]));
                }
            }
            puts("");
        }
    }

    Eo(N_bl);
    Eo(Nt);
    return 0;
}
Beispiel #7
0
double PZStability::eval(const arma::vec & x, int mode) {
  double focktol=ROUGHTOL;

  // Rotation cutoff
  double rotcut=10*DBL_EPSILON;
  
  if(restr) {
    rscf_t tmp(rsol);

    // List of occupieds to check
    std::vector<size_t> chkorb;
    if(mode==-1 || mode == 0) {
      for(size_t o=0;o<oa;o++)
	chkorb.push_back(o);
    }
    
    // Get rotation matrix
    arma::cx_mat Rov;
    if(cancheck) {
      // ov rotation matrix
      Rov=ov_rotation(x,false);
      // Get list of changed occupied orbitals
      if(mode==1)
	chkorb=check_ov(Rov.submat(0,oa,oa-1,Rov.n_cols-1),rotcut);
    }
    
    // Do we need to do the reference part?
    if(chkorb.size() || mode==-1 || mode==0) {
      if(cancheck) {
	// Rotate orbitals
	tmp.cC=tmp.cC*Rov;
	
	// Update density matrix
	tmp.P=2.0*arma::real(tmp.cC.cols(0,oa-1)*arma::trans(tmp.cC.cols(0,oa-1)));
      }
      
      // Dummy occupation vector
      std::vector<double> occa(oa,2.0);

      // Build global Fock operator
      solverp->Fock_RDFT(tmp,occa,method,grid,nlgrid,focktol);

      // Update reference energy
      if(mode==-1)
	ref_E0=tmp.en.E;
      
    } else if(mode==1) {
      // No, we don't. Set energy
      tmp.en.E=ref_E0;
    } else {
      ERROR_INFO();
      throw std::runtime_error("Shouldn't be here!\n");
    }
    
    // Get oo rotation
    arma::cx_mat Roo;
    if(oocheck) {
      Roo=oo_rotation(x,false);
      if(mode==1)
	check_oo(chkorb,Roo,rotcut);
    } else
      Roo.eye(oa,oa);

    // Orbital SI energies
    arma::vec Eo(ref_Eo);

    // Do we need to do anything for the oo part?
    if(chkorb.size() || mode == 0 || mode == -1) {
      // Collect list of changed occupied orbitals
      arma::uvec orblist(arma::sort(arma::conv_to<arma::uvec>::from(chkorb)));
      
      // Transformed oo block
      arma::cx_mat Ct=tmp.cC.cols(0,oa-1)*Roo;
      // Dummy matrix
      arma::cx_mat Rdum=arma::eye(orblist.n_elem,orblist.n_elem)*COMPLEX1;

      // Build the SI part
      std::vector<arma::cx_mat> Forb;
      arma::vec Eorb;
      solverp->PZSIC_Fock(Forb,Eorb,Ct.cols(orblist),Rdum,method,grid,nlgrid,false);

      if(mode==1) {
	for(size_t i=0;i<orblist.n_elem;i++)
	  Eo(orblist(i))=Eorb(i);
      } else {
	Eo=Eorb;

	if(mode==-1)
	  // Update reference
	  ref_Eo=Eorb;
      }
    }

    // Account for spin
    return tmp.en.E - 2.0*arma::sum(Eo);

  } else {
    uscf_t tmp(usol);

    // List of occupieds to check
    std::vector<size_t> chkorba, chkorbb;
    if(mode==-1 || mode==0) {
      for(size_t o=0;o<oa;o++)
	chkorba.push_back(o);
      for(size_t o=0;o<ob;o++)
	chkorbb.push_back(o);
    }
      
    // Get rotation matrix
    arma::cx_mat Rova, Rovb;
    if(cancheck) {
      // ov rotation matrix
      Rova=ov_rotation(x,false);
      Rovb=ov_rotation(x,true);
      // Get list of changed occupied orbitals
      if(mode==1) {
	chkorba=check_ov(Rova.submat(0,oa,oa-1,oa+va-1),rotcut);
	chkorbb=check_ov(Rovb.submat(0,ob,ob-1,ob+vb-1),rotcut);
      }
    }
    
    // Do we need to do the reference part?
    if(chkorba.size() || chkorbb.size() || mode==-1 || mode==0) {
      if(cancheck) {
	// Rotate orbitals
	tmp.cCa=tmp.cCa*Rova;
	tmp.cCb=tmp.cCb*Rovb;
      
	// Update density matrix
	tmp.Pa=arma::real(tmp.cCa.cols(0,oa-1)*arma::trans(tmp.cCa.cols(0,oa-1)));
	tmp.Pb=arma::real(tmp.cCb.cols(0,ob-1)*arma::trans(tmp.cCb.cols(0,ob-1)));
	tmp.P=tmp.Pa+tmp.Pb;
      }
      
      // Dummy occupation vector
      std::vector<double> occa(oa,1.0);
      std::vector<double> occb(ob,1.0);
      
      // Build global Fock operator
      solverp->Fock_UDFT(tmp,occa,occb,method,grid,nlgrid,focktol);

      // Update reference energy
      if(mode==-1)
	ref_E0=tmp.en.E;
      
    } else if(mode==1) {
      // No, we don't. Set energy
      tmp.en.E=ref_E0;
    } else {
      ERROR_INFO();
      throw std::runtime_error("Shouldn't be here!\n");
    }
    
    // Get oo rotation
    arma::cx_mat Rooa, Roob;
    if(oocheck) {
      Rooa=oo_rotation(x,false);
      Roob=oo_rotation(x,true);

      if(mode==1) {
	check_oo(chkorba,Rooa,rotcut);
	check_oo(chkorbb,Roob,rotcut);
      }
    } else {
      Rooa.eye(oa,oa);
      Roob.eye(ob,ob);
    }
    
    // Orbital SI energies
    arma::vec Eoa(ref_Eoa), Eob(ref_Eob);

    // Do we need to do anything for the oo part?
    if(chkorba.size() || mode == 0 || mode == -1) {
      // Collect list of changed occupied orbitals
      arma::uvec orblist(arma::sort(arma::conv_to<arma::uvec>::from(chkorba)));
      
      // Transformed oo block
      arma::cx_mat Ct=tmp.cCa.cols(0,oa-1)*Rooa;
      // Dummy matrix
      arma::cx_mat Rdum=arma::eye(orblist.n_elem,orblist.n_elem)*COMPLEX1;
      
      // Build the SI part
      std::vector<arma::cx_mat> Forb;
      arma::vec Eorb;
      solverp->PZSIC_Fock(Forb,Eorb,Ct.cols(orblist),Rdum,method,grid,nlgrid,false);

      // Collect energies
      if(mode==1) {
	for(size_t i=0;i<orblist.n_elem;i++)
	  Eoa(orblist(i))=Eorb(i);
      } else {
	Eoa=Eorb;

	if(mode==-1)
	  // Update reference
	  ref_Eoa=Eorb;
      }
    }
    if(chkorbb.size() || mode == 0 || mode == -1) {
      // Collect list of changed occupied orbitals
      arma::uvec orblist(arma::sort(arma::conv_to<arma::uvec>::from(chkorbb)));
      
      // Transformed oo block
      arma::cx_mat Ct=tmp.cCb.cols(0,ob-1)*Roob;
      // Dummy matrix
      arma::cx_mat Rdum=arma::eye(orblist.n_elem,orblist.n_elem)*COMPLEX1;
      
      // Build the SI part
      std::vector<arma::cx_mat> Forb;
      arma::vec Eorb;
      solverp->PZSIC_Fock(Forb,Eorb,Ct.cols(orblist),Rdum,method,grid,nlgrid,false);
      
      // Collect energies
      if(mode==1) {
	for(size_t i=0;i<orblist.n_elem;i++)
	  Eob(orblist(i))=Eorb(i);
      } else {
	Eob=Eorb;
	
	if(mode==-1)
	  // Update reference
	  ref_Eob=Eorb;
      }
    }
    
    // Result is
    return tmp.en.E-arma::sum(Eoa)-arma::sum(Eob);
  }
}