//create ,pass and recieve a simple dictionary. [Note Dictionary will be // homogenous. This demo gives an idea on how to deal withthe heterogenous // case.] int eg6() { int i=0,l=2; K keys=ktn(KS,l); K vals=ktn(KI,l); K dict; K result,resultk,resultv; //A dictionary is a mapping of two conforming lists. kI(vals)[0]=1; kI(vals)[1]=2; kS(keys)[0]=ss("key1"); kS(keys)[1]=ss("key2"); // Turn these into a dictionary dict=xD(keys,vals); result=k(c,"{[x]x[`key3]:`int$.z.t;show x;x}",dict,(K)0); printf( " This return has [type=%i] and contains %i enclosed elements\n\n\n",result->t,result->i); //Extract the keys and value vectors from the k bject resultk=kK(result)[0]; resultv=kK(result)[1]; //extract the lenth of the vectors l=resultk->n; printf( " The returned dictionary has %i elements.\n",l); for(i=0;i<l;i++) { printf( " The %i key is %s \n",i,kS(resultk)[i]); printf( " The associated value is %i \n",kI(resultv)[i]); } return 1; }
//create ,pass and recieve a simple table. int eg7() { K cc,d,e,v,tab; K flip,result,columnNames,columnData; int row,col,nCols,nRows; cc=ktn(KS,2);kS(cc)[0]=ss("pid");kS(cc)[1]=ss("uid"); d=ktn(KS,3);kS(d)[0]=ss("ibm");kS(d)[1]=ss("gte");kS(d)[2]=ss("kvm"); e=ktn(KI,3);kI(e)[0]=1;kI(e)[1]=2;kI(e)[2]=3; v=knk(2,d,e); tab=xT(xD(cc,v)); flip=k(c,"{[x]a:update t:.z.t,y:.z.d from x;.tst.t:a;a}",tab,(K)0); //Turn into a dictionary. flip->k [transpose?] //Display table. [Borrowed from code.kx.com: // https://code.kx.com/trac/attachment/wiki/Cookbook/InterfacingWithC/csv.c ] columnNames=kK(flip->k)[0]; columnData=kK(flip->k)[1]; nCols=columnNames->n; nRows=kK(columnData)[0]->n; for(row=0;row<nRows;row++) { if(0==row) { for(col=0;col<nCols;col++) { if(col>0)printf(","); printf("%s",kS(columnNames)[col]); } printf("\n"); } for(col=0;col<nCols;col++) { K obj=kK(columnData)[col]; if(col>0)printf(","); switch(obj->t) { case(1):{printf("%d",kG(obj)[row]);}break; case(4):{printf("%d",kG(obj)[row]);}break; case(5):{printf("%d",kH(obj)[row]);}break; case(6):{printf("%d",kI(obj)[row]);}break; case(7):{printf("%lld",kJ(obj)[row]);}break; case(8):{printf("%f",kE(obj)[row]);}break; case(9):{printf("%f",kF(obj)[row]);}break; case(11):{printf("%s",kS(obj)[row]);}break; case(19):{printf("%i",kI(obj)[row]);}break; case(14):{printf("%i",kI(obj)[row]);}break; default:{printf("unknown type");}break; } } printf("\n"); } return 1; }
// join an integer to a list and join a K object to a list int eg8() { K z=ki(20); K intlist=ktn(KI,0); K x=ktn(0,0); DO(5,ja(&intlist,&i)); jk(&x,intlist); jk(&x,z); k(c,"display",x,(K)0); return 1; }
static int ProcessMessage(const FeedData *data) { static int sent = 0; K condvec; if (trades == NULL) { trades = create_trade_schema(); } if (quotes == NULL) { quotes = create_quote_schema(); } switch(data->type) { case FF_TRADE_MSG: js(&kK(trades)[0], ss(data->core.sym)); js(&kK(trades)[1], ss(data->core.exg)); ja(&kK(trades)[2], (void *) &data->msg.trade.size); ja(&kK(trades)[3], (void *) &data->msg.trade.volume); ja(&kK(trades)[4], (void *) &data->core.sequence); ja(&kK(trades)[5], (void *) &data->msg.trade.price); condvec = ktn(4, KC); memcpy(&kC(condvec)[0], &data->core.cond, 4); jk(&kK(trades)[6], condvec); break; case FF_QUOTE_MSG: js(&kK(quotes)[0], ss(data->core.sym)); js(&kK(quotes)[1], ss(data->core.exg)); ja(&kK(quotes)[2], (void *) &data->msg.quote.asksize); ja(&kK(quotes)[3], (void *) &data->msg.quote.bidsize); ja(&kK(quotes)[4], (void *) &data->msg.quote.askprice); ja(&kK(quotes)[5], (void *) &data->msg.quote.bidprice); ja(&kK(quotes)[6], (void *) &data->core.sequence); condvec = ktn(4, KC); memcpy(&kC(condvec)[0], &data->core.cond, 4); jk(&kK(quotes)[7], condvec); break; } if (++sent >= 10) { SendToKDB("quote", quotes); quotes = NULL; SendToKDB("trade", trades); trades = NULL; sent = 0; } return FEED_STATE; }
K eval(K x,K y,K z){K*k;S*b,s;SQLULEN w;SQLLEN*nb;SQLINTEGER*wb;H*tb,u,t,j=0,p,m;F f;C c[128];I n=xj<0;D d=d1(n?-xj:xj);U(d)x=y;Q(z->t!=-KJ||xt!=-KS&&xt!=KC,"type") if(z->j)SQLSetStmtAttr(d,SQL_ATTR_QUERY_TIMEOUT,(SQLPOINTER)(SQLULEN)z->j,0); if(xt==-KS)Q1(SQLColumns(d,(S)0,0,(S)0,0,xs,S0,(S)0,0))else{I e;K q=kpn(xG,xn);ja(&q,"\0");e=SQLExecDirect(d,q->G0,xn);r0(q);Q1(e)} SQLNumResultCols(d,&j);P(!j,(d0(d),knk(0))) b=malloc(j*SZ),tb=malloc(j*2),wb=malloc(j*SZ),nb=malloc(j*SZ),x=ktn(KS,j),y=ktn(0,j);// sqlserver: no bind past nonbind DO(j,Q1(SQLDescribeCol(d,(H)(i+1),c,128,&u,&t,&w,&p,&m))xS[i]=sn(c,u); if(t>90)t-=82; Q(t<-11||t>12,xS[i])wb[i]=ut[tb[i]=t=t>0?t:12-t]==KS&&w?w+1:wt[t];if(ut[t]==KS&&(n||!wb[i]||wb[i]>9))tb[i]=13) DO(j,kK(y)[i]=ktn(ut[t=tb[i]],0);if(w=wb[i])Q1(SQLBindCol(d,(H)(i+1),ct[t],b[i]=malloc(w),w,nb+i))) for(;SQL_SUCCEEDED(SQLFetch(d));)DO(j,k=kK(y)+i;u=ut[t=tb[i]];s=b[i];n=SQL_NULL_DATA==(int)nb[i]; if(!u)jk(k,n?ktn(ct[t]?KC:KG,0):wb[i]?kp(s):gb(d,(H)(i+1),t)); else ja(k,n?nu(u):u==KH&&wb[i]==1?(t=(H)*s,(S)&t):u==KS?(s=dtb(s,nb[i]),(S)&s):u<KD?s:u==KZ?(f=ds(s)+(vs(s+6)+*(I*)(s+12)/1e9)/8.64e4,(S)&f):(w=u==KD?ds(s):vs(s),(S)&w))) if(!SQLMoreResults(d))O("more\n");DO(j,if(wb[i])free(b[i]))R free(b),free(tb),free(wb),free(nb),d0(d),xT(xD(x,y));}
SEXP kx_r_execute_with_params(SEXP connection, SEXP query, SEXP param) { K result; SEXP s; kx_connection = INTEGER_VALUE(connection); int i, n = length(param); K vector = ktn(KF,n); for (i = 0; i < n; i++) { kF(vector)[i] = REAL(param)[i]; } result = k(kx_connection, (char*) CHARACTER_VALUE(query), vector, (K)0); if (0 == result) { error("Error: not connected to kdb+ server\n"); } else if (-128 == result->t) { char *e = calloc(strlen(result->s) + 1, 1); strcpy(e, result->s); r0(result); error("Error from kdb+: `%s\n", e); } s = from_any_kobject(result); r0(result); return s; }
K recieve_data(I x) { static char buf[BUFFER_SIZE]; read_bytes(sizeof(int), &buf); int tnamesize = 0; memcpy(&tnamesize, buf, sizeof(int)); read_bytes(tnamesize, &buf); buf[tnamesize] = '\0'; K tname = ks(buf); read_bytes(sizeof(J), &buf); J size = 0; memcpy(&size, buf, sizeof(J)); read_bytes(size, &buf); K bytes = ktn(KG, size); memcpy(kG(bytes), &buf, (size_t) size); K result = k(0, ".u.upd", tname, d9(bytes), (K) 0); r0(bytes); if (result != 0) { r0(result); } return (K) 0; }
//Createing simple vectors int eg5() { //Create a set of vectors of differing types each of length 5. int i=0,l=5; K vsymbol=ktn(KS,l); K vint=ktn(KI,l); K vfloat=ktn(KF,l); K vdate=ktn(KD,l); K vtime=ktn(KT,l); K vdatetime=ktn(KZ,l); K vtimestamp=ktn(KP,l); for(i=0;i<l;i++) { kS(vsymbol)[i]=ss("w"); kI(vint)[i]=i; kF(vfloat)[i]=i+0.0; kI(vdate)[i]=i; kI(vtime)[i]=i; kF(vdatetime)[i]=i+0.1*i; kJ(vtimestamp)[i]=i; } k(c,"display",vint,(K)0); k(c,"display",vsymbol,(K)0); k(c,"display",vfloat,(K)0); k(c,"display",vdate,(K)0); k(c,"display",vtime,(K)0); k(c,"display",vdatetime,(K)0); k(c,"display",vtimestamp,(K)0); return 1; }
static K run_test(void (*execute_test)(void(s1)(void),void(s2)(void)), int testCount) { int i; K result, kffc[3], kpmc[4]; for (i = 0 ; i < PMC_COUNT ; i++) pmc_fixed[i] = 0; for (i = 0 ; i < FFC_COUNT ; i++) ffc_fixed[i] = 0; ioctl(fd, IOCTL_MSR_CMDS, (long long)pmc_reset); execute_baseline(testCount, &start_baseline, &stop_baseline); pmc_fixed[0] = pmc_read[1].value / testCount; pmc_fixed[1] = pmc_read[2].value / testCount; pmc_fixed[2] = pmc_read[3].value / testCount; pmc_fixed[3] = pmc_read[4].value / testCount; ffc_fixed[0] = pmc_read[5].value / testCount; ffc_fixed[1] = pmc_read[6].value / testCount; ffc_fixed[2] = pmc_read[7].value / testCount; for (i = 0 ; i < PMC_COUNT ; i++) kpmc[i] = ktn(KJ, testCount); for (i = 0 ; i < FFC_COUNT ; i++) kffc[i] = ktn(KJ, testCount); for (i = 1 ; i < 1 + PMC_COUNT + FFC_COUNT ; i++) pmc_read[i].value = 0; for (i = 0 ; i < testCount ; i++) { ioctl(fd, IOCTL_MSR_CMDS, (long long)pmc_reset); execute_test(&start_counters, &stop_counters); kJ(kpmc[0])[i] = pmc_read[1].value - pmc_fixed[0]; kJ(kpmc[1])[i] = pmc_read[2].value - pmc_fixed[1]; kJ(kpmc[2])[i] = pmc_read[3].value - pmc_fixed[2]; kJ(kpmc[3])[i] = pmc_read[4].value - pmc_fixed[3]; kJ(kffc[0])[i] = pmc_read[5].value - ffc_fixed[0]; kJ(kffc[1])[i] = pmc_read[6].value - ffc_fixed[1]; kJ(kffc[2])[i] = pmc_read[7].value - ffc_fixed[2]; } result = knk(7, kffc[0], kffc[1], kffc[2], kpmc[0], kpmc[1], kpmc[2], kpmc[3]); return result; }
K hash(K x,K y){ int lenx,leny,i; lenx=x->n; leny=y->n; char message[lenx+1]; char hashfunction[leny+1]; if(10==(x->t)){ for(i=0;i<lenx;i++){ message[i]=kC(x)[i]; } message[lenx]=0; } if(10==(y->t)){ for(i=0;i<leny;i++){ hashfunction[i]=kC(y)[i]; } hashfunction[leny]=0; } int bytelength; unsigned char* (*foo)(const unsigned char*, size_t, unsigned char*); if(strcmp("sha1",hashfunction)==0){ bytelength=SHA_DIGEST_LENGTH; foo=&SHA1; } else if(strcmp("sha224",hashfunction)==0){ bytelength=SHA224_DIGEST_LENGTH; foo=&SHA224; } else if(strcmp("sha256",hashfunction)==0){ bytelength=SHA256_DIGEST_LENGTH; foo=&SHA256; } else if(strcmp("sha384",hashfunction)==0){ bytelength=SHA384_DIGEST_LENGTH; foo=&SHA384; } else if(strcmp("sha512",hashfunction)==0){ bytelength=SHA512_DIGEST_LENGTH; foo=&SHA512; } else if(strcmp("md5",hashfunction)==0){ bytelength=MD5_DIGEST_LENGTH; foo=&MD5; } else{ krr("Please choose a supported hash function"); return (K)0; } unsigned char result[bytelength]; foo((unsigned char*) message, strlen(message), result); K output=ktn(KG,bytelength); for(i=0;i<bytelength;i++){ kG(output)[i]=result[i]; } return output; }
// Data processor (executed within q's main thread) K invokeCallback(I socket) { static_assert(sizeof(::SOCKET) == sizeof(I), "SOCKET vs I: type mismatch!"); ::SOCKET sock = socket; assert(sock != INVALID_SOCKET); // Receive (WQID, len, serialized_K) from subscription thread # define RECV_CHECK(expectedSize, errorMsg) \ if (recvd != (expectedSize)) { \ std::cerr << "<recv> " << (errorMsg) << ": " << recvd << " < " << (expectedSize) << std::endl; \ return K_NIL; \ } ::WQID qid = 0; int recvd = ::recv(sock, reinterpret_cast<char*>(&qid), sizeof(::WQID), 0); RECV_CHECK(sizeof(::WQID), "WQID incomplete"); std::size_t len = 0; recvd = ::recv(sock, reinterpret_cast<char*>(&len), sizeof(len), 0); RECV_CHECK(sizeof(len), "size incomplete"); if (len > static_cast<std::size_t>(std::numeric_limits<int>::max())) { std::cerr << "<recv> serialized data (" << len << ") > 2G" << std::endl; return K_NIL; } q::K_ptr serialized(ktn(KB, len)); std::memset(kG(serialized.get()), 0, len); recvd = ::recv(sock, reinterpret_cast<char*>(kG(serialized.get())), len, 0); RECV_CHECK(len, "data incomplete"); # undef RECV_CHECK // Deserialize K object # if KX_USE_OKX //@ref https://groups.google.com/forum/#!topic/personal-kdbplus/pjsugT7590A if (!okx(serialized.get())) { std::cerr << "<recv> bad data: [" << util::hexBytes(kG(serialized.get()), static_cast<std::size_t>(serialized->n)) << ']' << std::endl; return K_NIL; } # endif q::K_ptr result(d9(serialized.get())); // Identify the origial query and callback std::string const callback = REGISTRY[qid]; if (callback.empty()) { std::cerr << "unknown WQID: " << qid << std::endl; return K_NIL; } static_assert(std::is_same<::WQID, J>::value, "WQID data type mismatch"); q::K_ptr output(k(0, const_cast<S>(callback.c_str()), kj(qid), result.release(), K_NIL)); if (output->t == -128) { std::cerr << "<q> '" << output->s << std::endl; } return output.release(); }
K hmac(K x,K y,K f) { int lenx,leny,lenf,i; lenx=x->n; leny=y->n; lenf=f->n; unsigned char secret[lenx+1]; unsigned char message[leny+1]; unsigned char hashfunction[lenf+1]; // copy x and y into regular cstrings if(10==(x->t)){ for(i=0;i<lenx;i++){ secret[i] =kC(x)[i]; } secret[lenx]=0; } if(10==(y->t)){ for(i=0;i<leny;i++){ message[i] =kC(y)[i]; } message[leny]=0; } if(10==(f->t)){ for(i=0;i<lenf;i++){ hashfunction[i]=kC(f)[i]; } hashfunction[lenf]=0; } unsigned int bytelength; const EVP_MD* (*evp_fn)(void); if(strcmp("sha1",hashfunction)==0){ bytelength=SHA_DIGEST_LENGTH; evp_fn=&EVP_sha1; } else if(strcmp("sha224",hashfunction)==0){ bytelength=SHA224_DIGEST_LENGTH; evp_fn=&EVP_sha224; } else if(strcmp("sha256",hashfunction)==0){ bytelength=SHA256_DIGEST_LENGTH; evp_fn=&EVP_sha256; } else if(strcmp("sha384",hashfunction)==0){ bytelength=SHA384_DIGEST_LENGTH; evp_fn=&EVP_sha384; } else if(strcmp("sha512",hashfunction)==0){ bytelength=SHA512_DIGEST_LENGTH; evp_fn=&EVP_sha512; } else if(strcmp("md5",hashfunction)==0){ bytelength=MD5_DIGEST_LENGTH; evp_fn=&EVP_md5; } else{ krr("Please choose a supported hash function"); return (K)0; } unsigned char* result; result=calloc(bytelength,sizeof(char)); HMAC(evp_fn(),secret,strlen(secret),message,strlen(message),result,NULL); K output=ktn(KG,bytelength); for(i=0;i<bytelength;i++){ kG(output)[i]=result[i]; } free(result); return output; }
K fa2q(double *data,long *dims,long d,long size){ int length=dims[0],elesize=size/length,i; K L; if(1==d){ L=ktn(KF,length); for(i=0;i<length;i++)kF(L)[i]=*(data+i); R L; }else if(1<d){ L=knk(0); for(i=0;i<length;i++)jk(&L,fa2q(data+i*elesize,dims+1,d-1,elesize)); R L; } R (K)0; }
K qrand(K x){ int saltlength,i; saltlength=x->i; unsigned char salt[saltlength]; if (RAND_bytes(salt,saltlength)==0){ krr("Random number generation failure"); return (K)0; } K output=ktn(KG,saltlength); for(i=0;i<saltlength;i++){ kG(output)[i]=salt[i]; } return output; }
K hmac_sha256_k (K x, K y){ TC(x, KC); TC(y, KC); int lenmsg, lenkey, i; lenmsg=x->n; lenkey=y->n; unsigned char message[lenmsg+1], key[lenkey+1]; for(i=0;i<lenmsg;i++){ message[i]=kC(x)[i]; } for(i=0;i<lenkey;i++){ key[i]=kC(y)[i]; } int bytelength=SHA256_DIGEST_LENGTH; unsigned char result[bytelength]; hmac_sha256(message, lenmsg, key, lenkey, result); K output=ktn(KG, bytelength); for(i=0;i<bytelength;i++){ kG(output)[i]=result[i]; } return output; }
TDF_API K K_DECL TDF_optionCodeInfo(K h, K windCode) { ::THANDLE tdf = NULL; std::string code; try { TDF::parseTdfHandle(h, tdf); code = q::q2String(windCode); } catch (std::string const& error) { return q::error2q(error); } ::TDF_OPTION_CODE info = { 0 }; ::TDF_ERR result = static_cast<::TDF_ERR>(::TDF_GetOptionCodeInfo(tdf, code.c_str(), &info)); if (result != TDF_ERR_SUCCESS) { return q::error2q(::TDF::getError(result)); } q::K_ptr data(ktn(0, 6 + 12)); kK(data.get())[0 + 0] = ks(const_cast<S>(info.basicCode.szWindCode)); kK(data.get())[0 + 1] = ks(const_cast<S>(info.basicCode.szMarket)); kK(data.get())[0 + 2] = ks(const_cast<S>(info.basicCode.szCode)); kK(data.get())[0 + 3] = ks(const_cast<S>(info.basicCode.szENName)); kK(data.get())[0 + 4] = ks(const_cast<S>(Wind::encoder::GB18030_UTF8::encode(info.basicCode.szCNName).c_str())); kK(data.get())[0 + 5] = kg(info.basicCode.nType); kK(data.get())[6 + 0] = ks(const_cast<S>(info.szContractID)); kK(data.get())[6 + 1] = ks(const_cast<S>(info.szUnderlyingSecurityID)); kK(data.get())[6 + 2] = kc(info.chCallOrPut); kK(data.get())[6 + 3] = kd(q::date2q(info.nExerciseDate)); kK(data.get())[6 + 4] = kc(info.chUnderlyingType); kK(data.get())[6 + 5] = kc(info.chOptionType); kK(data.get())[6 + 6] = kc(info.chPriceLimitType); kK(data.get())[6 + 7] = ki(info.nContractMultiplierUnit); kK(data.get())[6 + 8] = kf(info.nExercisePrice); kK(data.get())[6 + 9] = kd(q::date2q(info.nStartDate)); kK(data.get())[6 + 10] = kd(q::date2q(info.nEndDate)); kK(data.get())[6 + 11] = kd(q::date2q(info.nExpireDate)); return data.release(); }
K pbkdf2(K qpassword,K qsalt,K qiterations, K qdklen){ int iterations,dklen,passlen,saltlen,i,retv; passlen=qpassword->n; saltlen=qsalt->n; char password[passlen]; unsigned char salt[saltlen]; iterations=qiterations->i; dklen=qdklen->i; unsigned char result[dklen]; if(10==(qpassword->t)){ for(i=0;i<passlen;i++){ password[i]=kC(qpassword)[i]; } password[passlen]=0; } if(4==(qsalt->t)){ for(i=0;i<saltlen;i++){ salt[i]=kG(qsalt)[i]; } } retv=PKCS5_PBKDF2_HMAC_SHA1(password,strlen(password),salt,sizeof(salt),iterations,dklen,result); if(retv==0){ krr("PKCS5_PBKDF2_HMAC_SHA1 failed"); return (K)0; } K output=ktn(KG,dklen); for(i=0;i<dklen;i++){ kG(output)[i]=result[i]; } return output; }
TDF_API K K_DECL TDF_codeTable(K h, K market) { ::THANDLE tdf = NULL; std::string mkt; try { TDF::parseTdfHandle(h, tdf); mkt = q::q2String(market); } catch (std::string const& error) { return q::error2q(error); } unsigned int codeCount = 0; ::TDF_CODE* t = NULL; ::TDF_ERR const result = static_cast<::TDF_ERR>(::TDF_GetCodeTable(tdf, mkt.c_str(), &t, &codeCount)); TDF::Ptr<::TDF_CODE> codes(t); if (result != TDF_ERR_SUCCESS) { return q::error2q(TDF::getError(result)); } assert(codes); assert(codeCount >= 0); q::K_ptr data(ktn(0, 6)); kK(data.get())[0] = //Wind Code: AG1312.SHF Wind::accessor::SymbolAccessor<::TDF_CODE, char[32]>(&::TDF_CODE::szWindCode).extract(codes.get(), codeCount); kK(data.get())[1] = //market code: SHF Wind::accessor::SymbolAccessor<::TDF_CODE, char[ 8]>(&::TDF_CODE::szMarket).extract(codes.get(), codeCount); kK(data.get())[2] = //original code: ag1312 Wind::accessor::SymbolAccessor<::TDF_CODE, char[32]>(&::TDF_CODE::szCode).extract(codes.get(), codeCount); kK(data.get())[3] = Wind::accessor::SymbolAccessor<::TDF_CODE, char[32]>(&::TDF_CODE::szENName).extract(codes.get(), codeCount); kK(data.get())[4] = //Chinese name: »¦Òø1302 Wind::accessor::SymbolAccessor<::TDF_CODE, char[32], Wind::encoder::GB18030_UTF8>(&::TDF_CODE::szCNName).extract(codes.get(), codeCount); kK(data.get())[5] = Wind::accessor::IntAccessor<::TDF_CODE, G>(&::TDF_CODE::nType).extract(codes.get(), codeCount); return data.release(); }
extern "C" K qHMAC512(K data, K key) { unsigned int SHA512_DIGEST_LENGTH=64; unsigned char md[SHA512_DIGEST_LENGTH]; unsigned char result[SHA512_DIGEST_LENGTH]; unsigned int len=0; K ret = ktn(KG,SHA512_DIGEST_LENGTH); HMAC_CTX ctx; HMAC_CTX_init(&ctx); HMAC_Init_ex(&ctx, key->s, strlen(key->s), EVP_sha512(), NULL); HMAC_Update(&ctx, (unsigned char*)(data->s), strlen(data->s)); HMAC_Final(&ctx, result, &len); HMAC_CTX_cleanup(&ctx); for(int i=0; i < len ; i++) kG(ret)[i]=result[i]; return (ret); }
Z K1(zmsgpopC){PC(x);if(zmsg_size(VSK(x))==0)R krr("empty");zframe_t* f=zmsg_pop(VSK(x));size_t msz=zframe_size(f);K r=ktn(KC,(J)msz);memcpy(kG(r),zframe_data(f),msz);R r;}
K threads_init(K x) { unsigned char bytes[]={0x01,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x65,0x13}; K s=ktn(KG,sizeof(bytes));memcpy(kG(s),bytes,sizeof(bytes)); if(!okx(s))R krr("serialization");value_fn=d9(s); if(!(threadpool=threadpool_create(NUMTHREADS,QUEUESIZE,0)))R krr("threadpool"); if(pipe(mainloop_pipe)==-1)R krr("pipe");sd1(mainloop_pipe[0],threads_q_callback);R(K)0;}
ZK d0(I d){if(f)x=ktn(KS,0),y=ktn(0,0);else x=ktn(0,0);dispatch(0);P(xn,k(0,"f",x,y,(K)0))if(y)r0(y);R x;}
static int enc(K*k,lua_State *L) { switch (lua_type(L, -1)) { case LUA_TSTRING: { size_t len;const char *str = lua_tolstring(L,-1,&len);(*k)=kpn(str,len);R 1;} break; case LUA_TNUMBER: { F num = lua_tonumber(L,-1);(*k) = (num==floor(num))?kj((J)num):kf(num);R 1;} break; case LUA_TBOOLEAN: { (*k)=kb( lua_toboolean(L,-1) );R 1;} break; case LUA_TNIL: { (*k)=ktn(0,0);R 1;} break; case LUA_TTABLE: { double p; int max = 0; int items = 0; int t_integer = 0, t_number = 0, t_boolean = 0, t_other= 0; lua_pushnil(L); /* table, startkey */ while (lua_next(L, -2) != 0) { items++; /* table, key, value */ switch (lua_type(L, -1)) { case LUA_TNUMBER: t_number++; p = lua_tonumber(L,-1); t_integer += (floor(p) == p); break; case LUA_TBOOLEAN: t_boolean++; break; default: t_other++; break; /* or anything else */ }; if (lua_type(L, -2) == LUA_TNUMBER && (p = lua_tonumber(L, -2))) { /* Integer >= 1 ? */ if (floor(p) == p && p >= 1) { if (p > max) max = p; lua_pop(L, 1); continue; } } /* Must not be an array (non integer key) */ for (lua_pop(L,1); lua_next(L, -2) != 0; lua_pop(L,1)) ++items; max = 0; break; } lua_pushnil(L); if (max != items) { /* build K dictionary */ K keys = ktn(KS,items); K values = ktn(0,items); int n = 0; /* table, startkey */ while (lua_next(L, -2) != 0) { kS(keys)[n] = ss(lua_tostring(L, -2)); if(!enc(kK(values)+n,L))R 0; lua_pop(L,1); ++n; } *k = xD(keys,values); R 1; } /* build K list */ if(t_other || ((!!t_boolean)+(!!t_number)) > 1) { K a = ktn(0,items); while (lua_next(L, -2) != 0) { p = lua_tonumber(L, -2); if(!enc(kK(a)+LI(p),L))R 0; lua_pop(L, 1); } *k = a; R 1; } if(t_boolean) { K a = ktn(KB,items); while (lua_next(L, -2) != 0) { p = lua_tonumber(L, -2); kG(a)[LI(p)] = lua_toboolean(L,-1); lua_pop(L, 1); } *k = a; R 1; } if(t_number == t_integer) { K a = ktn(KJ,items); while (lua_next(L, -2) != 0) { p = lua_tonumber(L, -2); kJ(a)[LI(p)] = (int)floor(lua_tonumber(L,-1)); lua_pop(L, 1); } *k = a; R 1; } if(t_number) { K a = ktn(KF,items); while (lua_next(L, -2) != 0) { p = lua_tonumber(L, -2); kF(a)[LI(p)] = lua_tonumber(L,-1); lua_pop(L, 1); } *k = a; R 1; } *k = ktn(0,0); R 1; }; break; default: luaL_error(L, "Cannot serialise %s: %s", lua_typename(L, lua_type(L, -1)), "can't serialize type"); R 0; }; }
// libzmq Z K0(version){K mnp=ktn(KI,3); zmq_version(&kI(mnp)[0],&kI(mnp)[1],&kI(mnp)[2]); R mnp;}
ZK gb(D d,H j,I t){H c=ct[t],g=c?c:-2,m=512;K x=ktn(c?KC:KG,m),y=ktn(xt,0);SQLULEN n=0;SQLRETURN r;while(1){r=SQLGetData(d,j,g,kG(x),xn=m,&n);if(SQL_SUCCEEDED(r))xn=n==SQL_NULL_DATA?0:n==SQL_NO_TOTAL||n>xn?xn:n,xn-=xn&&c&&!kG(x)[xn-1],jv(&y,x);else/*if(r==SQL_NO_DATA)*/break;}r0(x);R y;}
void Foam::kineticTheoryModel::solve(const volTensorField& gradUat) { if (!kineticTheory_) { return; } const scalar sqrtPi = sqrt(constant::mathematical::pi); surfaceScalarField phi(1.5*rhoa_*phia_*fvc::interpolate(alpha_)); volTensorField dU(gradUat.T()); //fvc::grad(Ua_); volSymmTensorField D(symm(dU)); // NB, drag = K*alpha*beta, // (the alpha and beta has been extracted from the drag function for // numerical reasons) volScalarField Ur(mag(Ua_ - Ub_)); volScalarField betaPrim(alpha_*(1.0 - alpha_)*draga_.K(Ur)); // Calculating the radial distribution function (solid volume fraction is // limited close to the packing limit, but this needs improvements) // The solution is higly unstable close to the packing limit. gs0_ = radialModel_->g0 ( min(max(alpha_, scalar(1e-6)), alphaMax_ - 0.01), alphaMax_ ); // particle pressure - coefficient in front of Theta (Eq. 3.22, p. 45) volScalarField PsCoeff ( granularPressureModel_->granularPressureCoeff ( alpha_, gs0_, rhoa_, e_ ) ); // 'thermal' conductivity (Table 3.3, p. 49) kappa_ = conductivityModel_->kappa(alpha_, Theta_, gs0_, rhoa_, da_, e_); // particle viscosity (Table 3.2, p.47) mua_ = viscosityModel_->mua(alpha_, Theta_, gs0_, rhoa_, da_, e_); dimensionedScalar Tsmall ( "small", dimensionSet(0 , 2 ,-2 ,0 , 0, 0, 0), 1.0e-6 ); dimensionedScalar TsmallSqrt = sqrt(Tsmall); volScalarField ThetaSqrt(sqrt(Theta_)); // dissipation (Eq. 3.24, p.50) volScalarField gammaCoeff ( 12.0*(1.0 - sqr(e_))*sqr(alpha_)*rhoa_*gs0_*(1.0/da_)*ThetaSqrt/sqrtPi ); // Eq. 3.25, p. 50 Js = J1 - J2 volScalarField J1(3.0*betaPrim); volScalarField J2 ( 0.25*sqr(betaPrim)*da_*sqr(Ur) /(max(alpha_, scalar(1e-6))*rhoa_*sqrtPi*(ThetaSqrt + TsmallSqrt)) ); // bulk viscosity p. 45 (Lun et al. 1984). lambda_ = (4.0/3.0)*sqr(alpha_)*rhoa_*da_*gs0_*(1.0+e_)*ThetaSqrt/sqrtPi; // stress tensor, Definitions, Table 3.1, p. 43 volSymmTensorField tau(2.0*mua_*D + (lambda_ - (2.0/3.0)*mua_)*tr(D)*I); if (!equilibrium_) { // construct the granular temperature equation (Eq. 3.20, p. 44) // NB. note that there are two typos in Eq. 3.20 // no grad infront of Ps // wrong sign infront of laplacian fvScalarMatrix ThetaEqn ( fvm::ddt(1.5*alpha_*rhoa_, Theta_) + fvm::div(phi, Theta_, "div(phi,Theta)") == fvm::SuSp(-((PsCoeff*I) && dU), Theta_) + (tau && dU) + fvm::laplacian(kappa_, Theta_, "laplacian(kappa,Theta)") + fvm::Sp(-gammaCoeff, Theta_) + fvm::Sp(-J1, Theta_) + fvm::Sp(J2/(Theta_ + Tsmall), Theta_) ); ThetaEqn.relax(); ThetaEqn.solve(); } else { // equilibrium => dissipation == production // Eq. 4.14, p.82 volScalarField K1(2.0*(1.0 + e_)*rhoa_*gs0_); volScalarField K3 ( 0.5*da_*rhoa_* ( (sqrtPi/(3.0*(3.0-e_))) *(1.0 + 0.4*(1.0 + e_)*(3.0*e_ - 1.0)*alpha_*gs0_) +1.6*alpha_*gs0_*(1.0 + e_)/sqrtPi ) ); volScalarField K2 ( 4.0*da_*rhoa_*(1.0 + e_)*alpha_*gs0_/(3.0*sqrtPi) - 2.0*K3/3.0 ); volScalarField K4(12.0*(1.0 - sqr(e_))*rhoa_*gs0_/(da_*sqrtPi)); volScalarField trD(tr(D)); volScalarField tr2D(sqr(trD)); volScalarField trD2(tr(D & D)); volScalarField t1(K1*alpha_ + rhoa_); volScalarField l1(-t1*trD); volScalarField l2(sqr(t1)*tr2D); volScalarField l3 ( 4.0 *K4 *max(alpha_, scalar(1e-6)) *(2.0*K3*trD2 + K2*tr2D) ); Theta_ = sqr((l1 + sqrt(l2 + l3))/(2.0*(alpha_ + 1.0e-4)*K4)); } Theta_.max(1.0e-15); Theta_.min(1.0e+3); volScalarField pf ( frictionalStressModel_->frictionalPressure ( alpha_, alphaMinFriction_, alphaMax_, Fr_, eta_, p_ ) ); PsCoeff += pf/(Theta_+Tsmall); PsCoeff.min(1.0e+10); PsCoeff.max(-1.0e+10); // update particle pressure pa_ = PsCoeff*Theta_; // frictional shear stress, Eq. 3.30, p. 52 volScalarField muf ( frictionalStressModel_->muf ( alpha_, alphaMax_, pf, D, phi_ ) ); // add frictional stress mua_ += muf; mua_.min(1.0e+2); mua_.max(0.0); Info<< "kinTheory: max(Theta) = " << max(Theta_).value() << endl; volScalarField ktn(mua_/rhoa_); Info<< "kinTheory: min(nua) = " << min(ktn).value() << ", max(nua) = " << max(ktn).value() << endl; Info<< "kinTheory: min(pa) = " << min(pa_).value() << ", max(pa) = " << max(pa_).value() << endl; }
ZK rs(I a,D d,H j){C b[128];SQLULEN n=128;K x=ktn(a?0:KS,0);if(!a)for(SQLBindCol(d,j,SQL_C_CHAR,b,n,&n);!SQLFetch(d);)js(&x,ss(b));R d0(d),x;}