int RSA::coprime(int e[MAX], int s[MAX]) /*//// 判断两个大数之间是否互质////*/ { int a[MAX], b[MAX], c[MAX], d[MAX], o[MAX], l[MAX]; int i; for (i = 0; i<MAX; i++) l[i] = o[i] = c[i] = d[i] = 0; o[0] = 0; o[MAX - 1] = 1; l[0] = 1; l[MAX - 1] = 1; mov(e, b); mov(s, a); do { if (cmp(b, l) == 0) { return 1; } for (i = 0; i<MAX; i++) c[i] = 0; divt(a, b, d, c); mov(b, a);/*b--->a*/ mov(c, b);/*c--->b*/ } while (cmp(c, o) != 0); /* printf("Ihey are not coprime!\n");*/ return 0; }
void DrivenCavity<Dim>::Jacobian(const vector_ptrtype& X, sparse_matrix_ptrtype& J) { auto U = Vh->element( "(u,p)" ); auto V = Vh->element( "(v,q)" ); auto u = U.template element<0>( "u" ); auto v = V.template element<0>( "u" ); auto p = U.template element<1>( "p" ); auto q = V.template element<1>( "p" ); //#if defined( FEELPP_USE_LM ) auto lambda = U.template element<2>(); auto nu = V.template element<2>(); //#endif if (!J) J = backend(_name="newtonns")->newMatrix( Vh, Vh ); auto a = form2( _test=Vh, _trial=Vh, _matrix=J ); a = integrate( elements( mesh ), inner(gradt( u ),grad( v ))/Re ); a += integrate( elements( mesh ), id(q)*divt(u) -idt(p)*div(v) ); // Convective terms a += integrate( elements( mesh ), trans(id(v))*gradv(u)*idt(u)); a += integrate( elements( mesh ), trans(id(v))*gradt(u)*idv(u)); //#if defined( FEELPP_USE_LM ) a += integrate(elements(mesh), id(q)*idt(lambda)+idt(p)*id(nu)); //#elif //a += integrate(elements(mesh), idt(p)*id(nu)); //Weak Dirichlet conditions a += integrate( boundaryfaces( mesh ),-trans( -idt(p)*N()+gradt(u)*N()/Re )*id( v ));// a += integrate( boundaryfaces( mesh ),-trans( -id(p)*N()+grad(u)*N()/Re )*idt( u ));// a += integrate( boundaryfaces( mesh ), +penalbc*inner( idt( u ),id( v ) )/hFace() ); }
void RSA::rsad(int e[MAX], int g[MAX], int *d) { int r[MAX], n1[MAX], n2[MAX], k[MAX], w[MAX]; int i, t[MAX], b1[MAX], b2[MAX], temp[MAX]; mov(g, n1); mov(e, n2); for (i = 0; i<MAX; i++) k[i] = w[i] = r[i] = temp[i] = b1[i] = b2[i] = t[i] = 0; b1[MAX - 1] = 0; b1[0] = 0;/*/b1=0;*/ b2[MAX - 1] = 1; b2[0] = 1;/*/b2=1;*/ while (1) { for (i = 0; i<MAX; i++) k[i] = w[i] = 0; divt(n1, n2, k, w);/*/k=n1/n2;*/ for (i = 0; i<MAX; i++) temp[i] = 0; mul(k, n2, temp);/*/temp=k*n2;*/ for (i = 0; i<MAX; i++) r[i] = 0; sub(n1, temp, r); if ((r[MAX - 1] == 1) && (r[0] == 0))/*/r=0*/ { break; } else { mov(n2, n1);/*/n1=n2;*/ mov(r, n2);/*/n2=r;*/ mov(b2, t);/*/t=b2;*/ for (i = 0; i<MAX; i++) temp[i] = 0; mul(k, b2, temp);/*/b2=b1-k*b2;*/ for (i = 0; i<MAX; i++) b2[i] = 0; sub(b1, temp, b2); mov(t, b1); } } for (i = 0; i<MAX; i++) t[i] = 0; add(b2, g, t); for (i = 0; i<MAX; i++) temp[i] = d[i] = 0; divt(t, g, temp, d); }
/*-------------接下来的重点任务是要着手解决 m=a^p mod n的函数问题------------*/ void RSA::expmod(int a[MAX], int p[MAX], int n[MAX], int *m) { int t[MAX], l[MAX], temp[MAX]; /*/t放入2,l放入1;*/ int w[MAX], s[MAX], c[MAX], b[MAX], i; for (i = 0; i<MAX - 1; i++) b[i] = l[i] = t[i] = w[i] = 0; t[0] = 2; t[MAX - 1] = 1; l[0] = 1; l[MAX - 1] = 1; mov(l, temp); mov(a, m); mov(p, b); while (cmp(b, l) != 0) { for (i = 0; i<MAX; i++) w[i] = c[i] = 0; divt(b, t, w, c);/*// c=p mod 2 w= p /2*/ mov(w, b);/*//p=p/2*/ if (cmp(c, l) == 0) /*/余数c==1*/ { for (i = 0; i<MAX; i++) w[i] = 0; mul(temp, m, w); mov(w, temp); for (i = 0; i<MAX; i++) w[i] = c[i] = 0; divt(temp, n, w, c);/* /c为余c=temp % n,w为商w=temp/n */ mov(c, temp); } for (i = 0; i<MAX; i++) s[i] = 0; mul(m, m, s);//s=a*a for (i = 0; i<MAX; i++) c[i] = 0; divt(s, n, w, c);/*/w=s/n;c=s mod n*/ mov(c, m); } for (i = 0; i<MAX; i++) s[i] = 0; mul(m, temp, s); for (i = 0; i<MAX; i++) c[i] = 0; divt(s, n, w, c); mov(c, m);/*余数s给m*/ m[MAX - 2] = a[MAX - 2];/*为后面的汉字显示需要,用第99位做为标记*/ return;/*/k=temp*k%n;*/ }
void RSA::mulmod(int a[MAX], int b[MAX], int n[MAX], int *m)/*解决 了 m=a*b mod n;*/ { int c[MAX], d[MAX]; int i; for (i = 0; i<MAX; i++) d[i] = c[i] = 0; mul(a, b, c); divt(c, n, d, m); //for(i=0;i<m[MAX-1];i++) // printf("%d",m[m[MAX-1]-i-1]); //printf("\nm length is : %d \n",m[MAX-1]); }
double exponential (double k) { int n; /*n es el contador de tÈrminos*/ double f; /*f es el valor del tÈrmino*/ for (n=0;n<15;n++) /*se aproximar· hasta el tÈrmino 15*/ { double c= expo(k,n); /*se eleva la base x al exponente n*/ long d= fact(n); /*se busca el factorial n*/ double t= divt (c,d); /*se dividen los resultados previos*/ f=f+t; /*se van sumando los tÈrminos sucesivos*/ } return f; }
static inline void assemble(boost::shared_ptr<Mesh<Simplex<Dim>>>& mesh, double* vec) { boost::timer time; auto Vh = FunctionSpace<Mesh<Simplex<Dim>>, bases<Lagrange<Order, Type>, Lagrange<OrderBis, TypeBis>>>::New(_mesh = mesh, _worldscomm = std::vector<WorldComm>(2, mesh->worldComm()), _extended_doftable = std::vector<bool>(2, false)); vec[2] = time.elapsed(); Environment::logMemoryUsage( "Assemble Stokes Memory Usage: FunctionSpace" ); vec[1] = Vh->nDof(); time.restart(); auto V = Vh->element(); auto v = V.template element<0>(); auto f = backend()->newVector(Vh); auto l = form1(_test = Vh, _vector = f); l = integrate(_range = elements(mesh), _expr = trans(oneY()) * id(v)); vec[4] = time.elapsed(); Environment::logMemoryUsage( "Assemble Stokes Memory Usage: Form1" ); time.restart(); auto U = Vh->element(); auto u = U.template element<0>(); auto p = U.template element<1>(); auto q = V.template element<1>(); auto A = backend()->newMatrix(Vh, Vh); vec[5] = time.elapsed(); Environment::logMemoryUsage( "Assemble Stokes Memory Usage: Matrix" ); time.restart(); auto a = form2(_trial = Vh, _test = Vh, _matrix = A); a = integrate(_range = elements(mesh), _expr = trace(gradt(u) * trans(grad(v)))); a += integrate(_range = elements(mesh), _expr = - div(v) * idt(p) ); a += integrate(_range = elements(mesh), _expr = - divt(u) * id(q)); a += on(_range = markedfaces(mesh, "Dirichlet"), _rhs = l, _element = u, _expr = zero<Dim, 1>()); vec[3] = time.elapsed(); auto mem = Environment::logMemoryUsage( "Assemble Stokes Memory Usage: Form2" ); v[6] = mem.memory_usage/1.e9; cleanup(); }
static inline void assemble(boost::shared_ptr<Mesh<Simplex<Dim>>>& mesh, double* vec) { boost::timer time; //HeapProfilerStart("FunctionSpace"); auto Vh = FunctionSpace<Mesh<Simplex<Dim>>, bases<Lagrange<Order, Type>>>::New(_mesh = mesh); //HeapProfilerDump("dump"); //HeapProfilerStop(); vec[2] = time.elapsed(); Environment::logMemoryUsage( "Assemble Elasticity Memory Usage: FunctionSpace" ); vec[1] = Vh->nDof(); auto E = 1e+8; auto nu = 0.25; auto mu = E / (2 * (1 + nu)); auto lambda = E * nu / ((1 + nu) * (1 - 2 * nu)); time.restart(); auto v = Vh->element(); auto f = backend()->newVector(Vh); auto l = form1(_test = Vh, _vector = f); l = integrate(_range = elements(mesh), _expr = -1e+3 * trans(oneY()) * id(v)); vec[4] = time.elapsed(); Environment::logMemoryUsage( "Assemble Elasticity Memory Usage: Form1" ); time.restart(); auto u = Vh->element(); auto A = backend()->newMatrix(Vh, Vh); vec[5] = time.elapsed(); Environment::logMemoryUsage( "Assemble Elasticity Memory Usage: Matrix" ); time.restart(); auto a = form2(_trial = Vh, _test = Vh, _matrix = A); a = integrate(_range = elements(mesh), _expr = lambda * divt(u) * div(v) + 2 * mu * trace(trans(sym(gradt(u))) * sym(grad(u)))); a += on(_range = markedfaces(mesh, "Dirichlet"), _rhs = l, _element = u, _expr = zero<Dim, 1>()); vec[3] = time.elapsed(); auto mem = Environment::logMemoryUsage( "Assemble Elasticity Memory Usage: Form2" ); v[6] = mem.memory_usage/1e9; cleanup(); }
void NavierStokes::run() { this->init(); auto U = Xh->element( "(u,p)" ); auto V = Xh->element( "(u,q)" ); auto u = U.element<0>( "u" ); auto v = V.element<0>( "u" ); auto p = U.element<1>( "p" ); auto q = V.element<1>( "p" ); #if defined( FEELPP_USE_LM ) auto lambda = U.element<2>(); auto nu = V.element<2>(); #endif //# endmarker4 # LOG(INFO) << "[dof] number of dof: " << Xh->nDof() << "\n"; LOG(INFO) << "[dof] number of dof/proc: " << Xh->nLocalDof() << "\n"; LOG(INFO) << "[dof] number of dof(U): " << Xh->functionSpace<0>()->nDof() << "\n"; LOG(INFO) << "[dof] number of dof/proc(U): " << Xh->functionSpace<0>()->nLocalDof() << "\n"; LOG(INFO) << "[dof] number of dof(P): " << Xh->functionSpace<1>()->nDof() << "\n"; LOG(INFO) << "[dof] number of dof/proc(P): " << Xh->functionSpace<1>()->nLocalDof() << "\n"; LOG(INFO) << "Data Summary:\n"; LOG(INFO) << " hsize = " << meshSize << "\n"; LOG(INFO) << " export = " << this->vm().count( "export" ) << "\n"; LOG(INFO) << " mu = " << mu << "\n"; LOG(INFO) << " bccoeff = " << penalbc << "\n"; //# marker5 # auto deft = gradt( u )+trans(gradt(u)); auto def = grad( v )+trans(grad(v)); //# endmarker5 # //# marker6 # // total stress tensor (trial) auto SigmaNt = -idt( p )*N()+mu*deft*N(); // total stress tensor (test) auto SigmaN = -id( p )*N()+mu*def*N(); //# endmarker6 # auto F = M_backend->newVector( Xh ); auto D = M_backend->newMatrix( Xh, Xh ); // right hand side auto ns_rhs = form1( _test=Xh, _vector=F ); LOG(INFO) << "[navier-stokes] vector local assembly done\n"; // construction of the BDF auto bdfns=bdf(_space=Xh); /* * Construction of the left hand side */ auto navierstokes = form2( _test=Xh, _trial=Xh, _matrix=D ); mpi::timer chrono; navierstokes += integrate( elements( mesh ), mu*inner( deft,def )+ trans(idt( u ))*id( v )*bdfns->polyDerivCoefficient( 0 ) ); LOG(INFO) << "mu*inner(deft,def)+(bdf(u),v): " << chrono.elapsed() << "\n"; chrono.restart(); navierstokes +=integrate( elements( mesh ), - div( v )*idt( p ) + divt( u )*id( q ) ); LOG(INFO) << "(u,p): " << chrono.elapsed() << "\n"; chrono.restart(); #if defined( FEELPP_USE_LM ) navierstokes +=integrate( elements( mesh ), id( q )*idt( lambda ) + idt( p )*id( nu ) ); LOG(INFO) << "(lambda,p): " << chrono.elapsed() << "\n"; chrono.restart(); #endif std::for_each( inflow_conditions.begin(), inflow_conditions.end(), [&]( BoundaryCondition const& bc ) { // right hand side ns_rhs += integrate( markedfaces( mesh, bc.marker() ), inner( idf(&bc,BoundaryCondition::operator()),-SigmaN+penalbc*id( v )/hFace() ) ); navierstokes +=integrate( boundaryfaces( mesh ), -inner( SigmaNt,id( v ) ) ); navierstokes +=integrate( boundaryfaces( mesh ), -inner( SigmaN,idt( u ) ) ); navierstokes +=integrate( boundaryfaces( mesh ), +penalbc*inner( idt( u ),id( v ) )/hFace() ); }); std::for_each( wall_conditions.begin(), wall_conditions.end(), [&]( BoundaryCondition const& bc ) { navierstokes +=integrate( boundaryfaces( mesh ), -inner( SigmaNt,id( v ) ) ); navierstokes +=integrate( boundaryfaces( mesh ), -inner( SigmaN,idt( u ) ) ); navierstokes +=integrate( boundaryfaces( mesh ), +penalbc*inner( idt( u ),id( v ) )/hFace() ); }); std::for_each( outflow_conditions.begin(), outflow_conditions.end(), [&]( BoundaryCondition const& bc ) { ns_rhs += integrate( markedfaces( mesh, bc.marker() ), inner( idf(&bc,BoundaryCondition::operator()),N() ) ); }); LOG(INFO) << "bc: " << chrono.elapsed() << "\n"; chrono.restart(); u = vf::project( _space=Xh->functionSpace<0>(), _expr=cst(0.) ); p = vf::project( _space=Xh->functionSpace<1>(), _expr=cst(0.) ); M_bdf->initialize( U ); for( bdfns->start(); bdfns->isFinished(); bdfns->next() ) { // add time dependent terms auto bdf_poly = bdfns->polyDeriv(); form1( _test=Xh, _vector=Ft ) = integrate( _range=elements(mesh), _expr=trans(idv( bdf_poly ))*id( v ) ); // add convective terms form1( _test=Xh, _vector=Ft ) += integrate( _range=elements(mesh), _expr=trans(gradv(u)*idv( u ))*id(v) ); // add contrib from time independent terms Ft->add( 1., F ); // add time stepping terms from BDF to right hand side backend()->solve( _matrix=D, _solution=U, _rhs=Ft ); this->exportResults( bdfns->time(), U ); } } // NavierNavierstokes::run
void Beam<nDim,nOrder>::run() { this->changeRepository( boost::format( "doc/manual/solid/%1%/%2%/P%3%/h_%4%/" ) % this->about().appName() % entity_type::name() % nOrder % meshSize ); /* * First we create the mesh */ mesh_ptrtype mesh = createGMSHMesh( _mesh=new mesh_type, _update=MESH_UPDATE_EDGES|MESH_UPDATE_FACES|MESH_CHECK, _desc=domain( _name=( boost::format( "beam-%1%" ) % nDim ).str() , _shape="hypercube", _xmin=0., _xmax=0.351, _ymin=0., _ymax=0.02, _zmin=0., _zmax=0.02, _h=meshSize ) ); // add marker clamped to the mesh mesh->addMarkerName( "clamped",( nDim==2 )?1:19, (nDim==2)?1:2); mesh->addMarkerName( "tip",( nDim==2)?3:27, (nDim==2)?1:2); /* * The function space and some associate elements are then defined */ timers["init"].first.restart(); space_ptrtype Xh = space_type::New( mesh ); Xh->printInfo(); element_type u( Xh, "u" ); element_type v( Xh, "v" ); timers["init"].second = timers["init"].first.elapsed(); /* * Data associated with the simulation */ auto E = doption(_name="E")*pascal; const double nu = doption(_name="nu"); auto mu = E/( 2*( 1+nu ) ); auto lambda = E*nu/( ( 1+nu )*( 1-2*nu ) ); auto density = 1e3; auto gravity = -2*newton/pow<Dim>(meter);//-density*0.05; LOG(INFO) << "lambda = " << lambda << "\n" << "mu = " << mu << "\n" << "gravity= " << gravity << "\n"; /* * Construction of the right hand side * * \f$ f = \int_\Omega g * v \f$ where \f$ g \f$ is a vector * directed in the \f$ y \f$ direction. */ auto F = backend()->newVector( Xh ); F->zero(); timers["assembly"].first.restart(); if ( Dim == 3 ) form1( _test=Xh, _vector=F ) = integrate( elements( mesh ), trans( gravity.value()*oneZ() )*id( v ) ); else form1( _test=Xh, _vector=F ) = integrate( elements( mesh ), trans( gravity.value()*oneY() )*id( v ) ); timers["assembly"].second = timers["assembly"].first.elapsed(); /* * Construction of the left hand side */ auto D = backend()->newMatrix( Xh, Xh ); timers["assembly"].first.restart(); auto deft = sym(gradt(u)); auto def = sym(grad(u)); auto a = form2( _test=Xh, _trial=Xh, _matrix=D ); a = integrate( elements( mesh ), lambda.value()*divt( u )*div( v ) + 2.*mu.value()*trace( trans( deft )*def ) ); if ( M_bctype == 1 ) // weak Dirichlet bc { auto Id = eye<nDim>(); a += integrate( markedfaces( mesh, "clamped" ), - trans( ( 2.*mu.value()*deft+lambda.value()*trace( deft )*Id )*N() )*id( v ) - trans( ( 2.*mu.value()*def+lambda.value()*trace( def )*Id )*N() )*idt( u ) + bcCoeff*std::max(2.*mu.value(),lambda.value())*trans( idt( u ) )*id( v )/hFace() ); } if ( M_bctype == 0 ) a += on( markedfaces( mesh, "clamped" ), u, F, zero<nDim,1>() ); timers["assembly"].second += timers["assembly"].first.elapsed(); backend(_rebuild=true)->solve( _matrix=D, _solution=u, _rhs=F ); v = vf::project( Xh, elements( Xh->mesh() ), P() ); this->exportResults( 0, u, v ); auto i1 = mean( _range=markedfaces( mesh, "tip" ), _expr=idv( u ) ); LOG(INFO) << "deflection: " << i1 << "\n"; } // Beam::run