int bound_mpi_int(int boundstage, int boundvartype, PFTYPE (*prim)[NSTORE2][NSTORE3][NUMPFLAGS]) { int dir; #if(USEMPI) /* These arrays contain designations that identify * each recv and send */ static MPI_Request requests[COMPDIM * 2 * 2]; // format of map for requests[dir*2+recv/send(0/1)] #endif #if(USEMPI) /////////////// // dir=1 if((boundstage==STAGE0)||(boundstage==STAGEM1)){ for(dir=X1UP;dir<=X1DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) pack_int(dir,boundvartype,prim,workbc_int); for(dir=X1UP;dir<=X1DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) sendrecv_int(dir,boundvartype,workbc_int,requests); } if((boundstage==STAGE1)||(boundstage==STAGEM1)){ for(dir=X1UP;dir<=X1DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) recvwait(dir,requests); for(dir=X1UP;dir<=X1DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) unpack_int(dir,boundvartype,workbc_int,prim); for(dir=X1UP;dir<=X1DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) sendwait(dir,requests); } /////////////// // dir=2 if((boundstage==STAGE2)||(boundstage==STAGEM1)){ for(dir=X2UP;dir<=X2DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) pack_int(dir,boundvartype,prim,workbc_int); for(dir=X2UP;dir<=X2DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) sendrecv_int(dir,boundvartype,workbc_int,requests); } if((boundstage==STAGE3)||(boundstage==STAGEM1)){ for(dir=X2UP;dir<=X2DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) recvwait(dir,requests); for(dir=X2UP;dir<=X2DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) unpack_int(dir,boundvartype,workbc_int,prim); for(dir=X2UP;dir<=X2DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) sendwait(dir,requests); } /////////////// // dir=3 if((boundstage==STAGE4)||(boundstage==STAGEM1)){ for(dir=X3UP;dir<=X3DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) pack_int(dir,boundvartype,prim,workbc_int); for(dir=X3UP;dir<=X3DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) sendrecv_int(dir,boundvartype,workbc_int,requests); } if((boundstage==STAGE5)||(boundstage==STAGEM1)){ for(dir=X3UP;dir<=X3DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) recvwait(dir,requests); for(dir=X3UP;dir<=X3DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) unpack_int(dir,boundvartype,workbc_int,prim); for(dir=X3UP;dir<=X3DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) sendwait(dir,requests); } // now corner zones will be filled correctly // GODMARK: If made fixup_utoprim() and check_solution() not use corner zones could bound all directions at once -- probably not important performance hit // end if mpi #endif return(0); }
int bound_mpi_int(int boundstage, int prim[][N2M][N3M][NUMPFLAGS]) { int dir; #if(USEMPI) /* These arrays contain designations that identify * each recv and send */ static MPI_Request requests[COMPDIM * 2 * 2]; // format of map for requests[dir*2+recv/send(0/1)] #endif #if(USEMPI) if((boundstage==STAGE0)||(boundstage==STAGEM1)){ for(dir=X1UP;dir<=X1DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) pack_int(dir,prim,workbc_int); for(dir=X1UP;dir<=X1DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) sendrecv_int(dir,workbc_int,requests); } if((boundstage==STAGE1)||(boundstage==STAGEM1)){ for(dir=X1UP;dir<=X1DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) recvwait(dir,requests); for(dir=X1UP;dir<=X1DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) unpack_int(dir,workbc_int,prim); for(dir=X1UP;dir<=X1DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) sendwait(dir,requests); } if((boundstage==STAGE2)||(boundstage==STAGEM1)){ for(dir=X2UP;dir<=X2DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) pack_int(dir,prim,workbc_int); for(dir=X2UP;dir<=X2DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) sendrecv_int(dir,workbc_int,requests); } if((boundstage==STAGE3)||(boundstage==STAGEM1)){ for(dir=X2UP;dir<=X2DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) recvwait(dir,requests); for(dir=X2UP;dir<=X2DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) unpack_int(dir,workbc_int,prim); for(dir=X2UP;dir<=X2DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) sendwait(dir,requests); } if((boundstage==STAGE4)||(boundstage==STAGEM1)){ for(dir=X3UP;dir<=X3DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) pack_int(dir,prim,workbc_int); for(dir=X3UP;dir<=X3DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) sendrecv_int(dir,workbc_int,requests); } if((boundstage==STAGE5)||(boundstage==STAGEM1)){ for(dir=X3UP;dir<=X3DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) recvwait(dir,requests); for(dir=X3UP;dir<=X3DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) unpack_int(dir,workbc_int,prim); for(dir=X3UP;dir<=X3DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) sendwait(dir,requests); } // end if mpi #endif return(0); }
/* pack sphere into double and integer buffers (d and i buffers are of initial * dsize and isize, while the final numberof of doubles and ints is packed) */ void SPHERE_Pack (SPHERE *sph, int *dsize, double **d, int *doubles, int *isize, int **i, int *ints) { pack_int (isize, i, ints, sph->surface); pack_int (isize, i, ints, sph->volume); pack_doubles (dsize, d, doubles, sph->cur_center, 3); pack_doubles (dsize, d, doubles, (double*)sph->cur_point, 9); pack_double (dsize, d, doubles, sph->cur_radius); pack_doubles (dsize, d, doubles, sph->ref_center, 3); pack_doubles (dsize, d, doubles, (double*)sph->ref_point, 9); pack_double (dsize, d, doubles, sph->ref_radius); pack_int (isize, i, ints, sph->mat ? 1 : 0); /* pack material existence flag */ if (sph->mat) pack_string (isize, i, ints, sph->mat->label); }
quint8 *MsgPackPrivate::pack_longlong(qint64 i, quint8 *p, bool wr) { if (i >= std::numeric_limits<qint32>::min() && i <= std::numeric_limits<quint32>::max()) return p = pack_int(i, p, wr); if (wr) *p = 0xd3; p++; if (wr) _msgpack_store64(p, i); return p + 8; }
/* pack ellipsoid into double and integer buffers (d and i buffers are of initial * dsize and isize, while the final numberof of doubles and ints is packed) */ void ELLIP_Pack (ELLIP *eli, int *dsize, double **d, int *doubles, int *isize, int **i, int *ints) { pack_int (isize, i, ints, eli->surface); pack_int (isize, i, ints, eli->volume); pack_doubles (dsize, d, doubles, eli->cur_center, 3); pack_doubles (dsize, d, doubles, (double*)eli->cur_point, 9); pack_doubles (dsize, d, doubles, eli->ref_center, 3); pack_doubles (dsize, d, doubles, (double*)eli->ref_point, 9); pack_doubles (dsize, d, doubles, eli->ref_sca, 3); pack_doubles (dsize, d, doubles, eli->ref_rot, 9); pack_doubles (dsize, d, doubles, eli->cur_sca, 3); pack_doubles (dsize, d, doubles, eli->cur_rot, 9); pack_int (isize, i, ints, eli->mat ? 1 : 0); /* pack material existence flag */ if (eli->mat) pack_string (isize, i, ints, eli->mat->label); }
quint8 *MsgPackPrivate::pack(const QVariant &v, quint8 *p, bool wr, QVector<QByteArray> &user_data) { QMetaType::Type t = (QMetaType::Type)v.type(); if (v.isNull() && !v.isValid()) p = pack_nil(p, wr); else if (t == QMetaType::Int) p = pack_int(v.toInt(), p, wr); else if (t == QMetaType::UInt) p = pack_uint(v.toUInt(), p, wr); else if (t == QMetaType::Bool) p = pack_bool(v, p, wr); else if (t == QMetaType::QString) p = pack_string(v.toString(), p, wr); else if (t == QMetaType::QVariantList) p = pack_array(v.toList(), p, wr, user_data); else if (t == QMetaType::QStringList) p = pack_stringlist(v.toStringList(), p, wr); else if (t == QMetaType::LongLong) p = pack_longlong(v.toLongLong(), p, wr); else if (t == QMetaType::ULongLong) p = pack_ulonglong(v.toULongLong(), p, wr); else if (t == QMetaType::Double) p = pack_double(v.toDouble(), p, wr); else if (t == QMetaType::Float) p = pack_float(v.toFloat(), p, wr); else if (t == QMetaType::QByteArray) p = pack_bin(v.toByteArray(), p, wr); else if (t == QMetaType::QVariantMap) p = pack_map(v.toMap(), p, wr, user_data); else { if (t == QMetaType::User) t = (QMetaType::Type)v.userType(); QReadLocker locker(&packers_lock); bool has_packer = user_packers.contains(t); if (has_packer) has_packer &= user_packers[t].packer != 0; locker.unlock(); if (has_packer) p = pack_user(v, p, wr, user_data); else qWarning() << "MsgPack::pack can't pack type:" << t; } return p; }
int bound_mpi_int_dir(int boundstage, int finalstep, int whichdir, int boundvartype, PFTYPE (*prim)[NSTORE2][NSTORE3][NUMPFLAGS]) { int dir; static MPI_Request requests[COMPDIM * 2 * 2]; static int didpostrecvs[COMPDIM*2]={0}; int dirstart,dirfinish; if(whichdir==-1 || whichdir==1){ dirstart=X1UP; dirfinish=X1DN;} if(whichdir==-2 || whichdir==2){ dirstart=X2UP; dirfinish=X2DN;} if(whichdir==-3 || whichdir==3){ dirstart=X3UP; dirfinish=X3DN;} //////////// // // pre-post recv's // // OPTMARK: Could avoid dir-dependent MPI calls in step_ch.c (currently true!) and post all recv's for all dirs at once. // OPTMARK: Or setup MPIFLOWCONTROL==2 or SUPERMPI // //////////// if(whichdir==-1 || whichdir==-2 || whichdir==-3){ if((boundstage==STAGEM1)||(boundstage==STAGE0)){ for(dir=dirstart;dir<=dirfinish;dir++){ if(dirgenset[boundvartype][dir][DIRIF]){ recvonly_int(dir,boundvartype,workbc_int,requests); didpostrecvs[dir]=1; } } } } else if(whichdir==1 || whichdir==2 || whichdir==3){ ////////////////// // // per-whichdir (1,2,3) conditionals for bounding. Assume whichdir=1 done first, then 2, then 3, so that corners are done correctly as done with normal bounds. // ////////////////// /////////////////// // // x or y or z -dir // once dir=0,1(X1UP,X1DN) is done, so can start 2,3(X2UP,X2DN) // ///////////////// if((boundstage==STAGEM1)||(boundstage==STAGE0&&whichdir==1 || boundstage==STAGE2&&whichdir==2 || boundstage==STAGE4&&whichdir==3)){ for(dir=dirstart;dir<=dirfinish;dir++){ if(dirgenset[boundvartype][dir][DIRIF]){ if(didpostrecvs[dir]==0){ dualfprintf(fail_file,"Did not post recv and tried to already pack: dir=%d\n",dir); myexit(234525155); } pack_int(dir,boundvartype,prim,workbc_int); } } for(dir=dirstart;dir<=dirfinish;dir++) if(dirgenset[boundvartype][dir][DIRIF]) sendonly_int(dir,boundvartype,workbc_int,requests); } if((boundstage==STAGEM1)||(boundstage==STAGE1&&whichdir==1 || boundstage==STAGE3&&whichdir==2 || boundstage==STAGE5&&whichdir==3)){ for(dir=dirstart;dir<=dirfinish;dir++) if(dirgenset[boundvartype][dir][DIRIF]){ recvwait(dir,requests); didpostrecvs[dir]=0; // done with recv's } for(dir=dirstart;dir<=dirfinish;dir++) if(dirgenset[boundvartype][dir][DIRIF]) unpack_int(dir,boundvartype,workbc_int,prim); for(dir=dirstart;dir<=dirfinish;dir++) if(dirgenset[boundvartype][dir][DIRIF]) sendwait(dir,requests); } } else{ dualfprintf(fail_file,"No such whichdir=%d in boundmpiint.c\n",whichdir); myexit(1986290387); } // now corner zones will be filled correctly // GODMARK: If made fixup_utoprim() and check_solution() not use corner zones could bound all directions at once -- probably not important performance hit return(0); }