STATIC void jclass_attr(mp_obj_t self_in, qstr attr_in, mp_obj_t *dest) { if (dest[0] == MP_OBJ_NULL) { // load attribute mp_obj_jclass_t *self = self_in; const char *attr = qstr_str(attr_in); jstring field_name = JJ(NewStringUTF, attr); jobject field = JJ(CallObjectMethod, self->cls, Class_getField_mid, field_name); if (!JJ1(ExceptionCheck)) { jfieldID field_id = JJ(FromReflectedField, field); jobject obj = JJ(GetStaticObjectField, self->cls, field_id); dest[0] = new_jobject(obj); return; } //JJ1(ExceptionDescribe); JJ1(ExceptionClear); mp_obj_jmethod_t *o = m_new_obj(mp_obj_jmethod_t); o->base.type = &jmethod_type; o->name = attr_in; o->meth = NULL; o->obj = self->cls; o->is_static = true; dest[0] = o; } }
STATIC void get_jclass_name(jobject obj, char *buf) { jclass obj_class = JJ(GetObjectClass, obj); jstring name = JJ(CallObjectMethod, obj_class, Class_getName_mid); jint len = JJ(GetStringLength, name); JJ(GetStringUTFRegion, name, 0, len, buf); check_exception(); }
STATIC void create_jvm() { JavaVMInitArgs args; JavaVMOption options; options.optionString = "-Djava.class.path=."; args.version = JNI_VERSION_1_6; args.nOptions = 1; args.options = &options; args.ignoreUnrecognized = 0; if (env) { return; } void *libjvm = dlopen(LIBJVM_SO, RTLD_NOW | RTLD_GLOBAL); if (!libjvm) { nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, "unable to load libjvm.so, use LD_LIBRARY_PATH")); } int (*_JNI_CreateJavaVM)(void*, void**, void*) = dlsym(libjvm, "JNI_CreateJavaVM"); int st = _JNI_CreateJavaVM(&jvm, (void**)&env, &args); if (st < 0 || !env) { nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, "unable to create JVM")); } Class_class = JJ(FindClass, "java/lang/Class"); jclass method_class = JJ(FindClass, "java/lang/reflect/Method"); String_class = JJ(FindClass, "java/lang/String"); jclass Object_class = JJ(FindClass, "java/lang/Object"); Object_toString_mid = JJ(GetMethodID, Object_class, "toString", "()Ljava/lang/String;"); Class_getName_mid = (*env)->GetMethodID(env, Class_class, "getName", "()Ljava/lang/String;"); Class_getField_mid = (*env)->GetMethodID(env, Class_class, "getField", "(Ljava/lang/String;)Ljava/lang/reflect/Field;"); Class_getMethods_mid = (*env)->GetMethodID(env, Class_class, "getMethods", "()[Ljava/lang/reflect/Method;"); Class_getConstructors_mid = (*env)->GetMethodID(env, Class_class, "getConstructors", "()[Ljava/lang/reflect/Constructor;"); Method_getName_mid = (*env)->GetMethodID(env, method_class, "getName", "()Ljava/lang/String;"); List_class = JJ(FindClass, "java/util/List"); List_get_mid = JJ(GetMethodID, List_class, "get", "(I)Ljava/lang/Object;"); List_set_mid = JJ(GetMethodID, List_class, "set", "(ILjava/lang/Object;)Ljava/lang/Object;"); List_size_mid = JJ(GetMethodID, List_class, "size", "()I"); IndexException_class = JJ(FindClass, "java/lang/IndexOutOfBoundsException"); }
STATIC mp_obj_t jobject_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) { mp_obj_jobject_t *self = self_in; mp_uint_t idx = mp_obj_get_int(index); char class_name[64]; get_jclass_name(self->obj, class_name); //printf("class: %s\n", class_name); if (class_name[0] == '[') { if (class_name[1] == 'L' || class_name[1] == '[') { if (value == MP_OBJ_NULL) { // delete assert(0); } else if (value == MP_OBJ_SENTINEL) { // load jobject el = JJ(GetObjectArrayElement, self->obj, idx); return new_jobject(el); } else { // store jvalue jval; const char *t = class_name + 1; py2jvalue(&t, value, &jval); JJ(SetObjectArrayElement, self->obj, idx, jval.l); return mp_const_none; } } mp_not_implemented(""); } if (!JJ(IsInstanceOf, self->obj, List_class)) { return MP_OBJ_NULL; } if (value == MP_OBJ_NULL) { // delete assert(0); } else if (value == MP_OBJ_SENTINEL) { // load jobject el = JJ(CallObjectMethod, self->obj, List_get_mid, idx); check_exception(); return new_jobject(el); } else { // store assert(0); } return MP_OBJ_NULL; }
STATIC mp_obj_t jmethod_call(mp_obj_t self_in, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) { if (n_kw != 0) { nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "kwargs not supported")); } mp_obj_jmethod_t *self = self_in; const char *name = qstr_str(self->name); // jstring meth_name = JJ(NewStringUTF, name); jclass obj_class = self->obj; if (!self->is_static) { obj_class = JJ(GetObjectClass, self->obj); } jarray methods = JJ(CallObjectMethod, obj_class, Class_getMethods_mid); return call_method(self->obj, name, methods, false, n_args, args); }
STATIC mp_obj_t new_jobject(jobject jo) { if (jo == NULL) { return mp_const_none; } else if (JJ(IsInstanceOf, jo, String_class)) { const char *s = JJ(GetStringUTFChars, jo, NULL); mp_obj_t ret = mp_obj_new_str(s, strlen(s), false); JJ(ReleaseStringUTFChars, jo, s); return ret; } else if (JJ(IsInstanceOf, jo, Class_class)) { return new_jclass(jo); } else { mp_obj_jobject_t *o = m_new_obj(mp_obj_jobject_t); o->base.type = &jobject_type; o->obj = jo; return o; } }
STATIC mp_obj_t jclass_call(mp_obj_t self_in, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) { if (n_kw != 0) { nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "kwargs not supported")); } mp_obj_jclass_t *self = self_in; jarray methods = JJ(CallObjectMethod, self->cls, Class_getConstructors_mid); return call_method(self->cls, NULL, methods, true, n_args, args); }
STATIC mp_obj_t jclass_call(mp_obj_t self_in, size_t n_args, size_t n_kw, const mp_obj_t *args) { if (n_kw != 0) { mp_raise_TypeError("kwargs not supported"); } mp_obj_jclass_t *self = self_in; jarray methods = JJ(CallObjectMethod, self->cls, Class_getConstructors_mid); return call_method(self->cls, NULL, methods, true, n_args, args); }
void OpenSMOKE_KPP_SingleReactor::PrintDeFalco(const int position, BzzMatrixSparse C_, OpenSMOKE_KPP_ReactorNetwork& network, ofstream &fDeFalco, ofstream &fDeFalco2) { // Reactions kinetics->UpdateProperties(omega_, temperature_, pressure_, R_); // Get dR_over_domega BzzMatrix JJ(omega_.Size(),omega_.Size()); kinetics->GetFormationRatesDerivatives(omega_, temperature_, pressure_, JJ); // JJ = dR_over_domega * volume JJ *= volume_; fDeFalco << "Cell " << position << endl; fDeFalco << "MassFractions " << omega_.Size() << endl; for(int j=1;j<=omega_.Size();j++) fDeFalco << setw(4) << left << j << setw(16) << left << omega_[j] << endl; fDeFalco << "FormationRates " << omega_.Size() << endl; for(int j=1;j<=omega_.Size();j++) fDeFalco << setw(4) << left << j << setw(16) << left << R_[j]*volume_ << endl; fDeFalco << "Jacobian " << omega_.Size() << " " << omega_.Size() << endl; for(int j=1;j<=omega_.Size();j++) for(int k=1;k<=omega_.Size();k++) fDeFalco << setw(4) << left << j << setw(4) << left << k << setw(16) << left << JJ[j][k] << endl; fDeFalco2 << "Cell " << position << endl; for(int j=1;j<=omega_.Size();j++) { double* ptrVal; int i, k; double val; double sum_total_out = 0.; double sum_total = 0.; C_.BeginScanning(); while(ptrVal = C_.Scanning(&i,&k,&val)) { if (i==position && k!=position) sum_total_out += -C_(position, k)*network.reactors(k).omega()[j]; // if (i==position && k!=position) // sum_total += -C_(position, k); } fDeFalco2 << setw(4) << left << j << setw(16) << left << omega_[j]; // fDeFalco2 << setw(16) << left << -C_(position, position)*omega_[j]; // fDeFalco2 << setw(16) << left << sum_total_out; fDeFalco2 << setw(16) << left << -C_(position, position)*omega_[j] + sum_total_out; fDeFalco2 << setw(16) << left << fIn_[j]; fDeFalco2 << setw(16) << left << R_[j]*volume_; fDeFalco2 << setw(16) << left << R_[j]*volume_ + fIn_[j] + sum_total_out -C_(position, position)*omega_[j]; // fDeFalco2 << setw(16) << left << -C_(position, position); // fDeFalco2 << setw(16) << left << sum_total; fDeFalco2 << endl; } }
STATIC mp_obj_t mod_jni_cls(mp_obj_t cls_name_in) { const char *cls_name = mp_obj_str_get_str(cls_name_in); if (!env) { create_jvm(); } jclass cls = JJ(FindClass, cls_name); mp_obj_jclass_t *o = m_new_obj(mp_obj_jclass_t); o->base.type = &jclass_type; o->cls = cls; return o; }
STATIC void check_exception(void) { jobject exc = JJ1(ExceptionOccurred); if (exc) { //JJ1(ExceptionDescribe); mp_obj_t py_e = new_jobject(exc); JJ1(ExceptionClear); if (JJ(IsInstanceOf, exc, IndexException_class)) { nlr_raise(mp_obj_new_exception_arg1(&mp_type_IndexError, py_e)); } nlr_raise(mp_obj_new_exception_arg1(&mp_type_Exception, py_e)); } }
STATIC mp_obj_t mod_jni_array(mp_obj_t type_in, mp_obj_t size_in) { if (!env) { create_jvm(); } mp_int_t size = mp_obj_get_int(size_in); jobject res = NULL; if (MP_OBJ_IS_TYPE(type_in, &jclass_type)) { mp_obj_jclass_t *jcls = type_in; res = JJ(NewObjectArray, size, jcls->cls, NULL); } else if (MP_OBJ_IS_STR(type_in)) { const char *type = mp_obj_str_get_str(type_in); switch (*type) { case 'Z': res = JJ(NewBooleanArray, size); break; case 'B': res = JJ(NewByteArray, size); break; case 'C': res = JJ(NewCharArray, size); break; case 'S': res = JJ(NewShortArray, size); break; case 'I': res = JJ(NewIntArray, size); break; case 'J': res = JJ(NewLongArray, size); break; case 'F': res = JJ(NewFloatArray, size); break; case 'D': res = JJ(NewDoubleArray, size); break; } } return new_jobject(res); }
STATIC mp_obj_t jobject_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) { mp_obj_jobject_t *self = self_in; if (!JJ(IsInstanceOf, self->obj, List_class)) { return MP_OBJ_NULL; } mp_uint_t idx = mp_obj_get_int(index); if (value == MP_OBJ_NULL) { // delete assert(0); } else if (value == MP_OBJ_SENTINEL) { // load jobject el = JJ(CallObjectMethod, self->obj, List_get_mid, idx); check_exception(); return new_jobject(el); } else { // store assert(0); } return MP_OBJ_NULL; }
STATIC mp_obj_t jobject_unary_op(mp_uint_t op, mp_obj_t self_in) { mp_obj_jobject_t *self = self_in; switch (op) { case MP_UNARY_OP_BOOL: case MP_UNARY_OP_LEN: { jint len = JJ(CallIntMethod, self->obj, List_size_mid); if (op == MP_UNARY_OP_BOOL) { return mp_obj_new_bool(len != 0); } return MP_OBJ_NEW_SMALL_INT(len); } default: return MP_OBJ_NULL; // op not supported } }
bool _send(T& t, M& method, JJ, const VV& value, int id) { if ( method.get_aspect().template get<_id_>().has(id) ) { method.get_aspect().template get<_id_>().pop(id); if ( t.get_aspect().template get<_send_custom_error_>()( t, JJ(), value, id ) ) return true; method.get_aspect().template get<_error_fail_>()( t, method, value, id ); } else method.get_aspect().template get< _invalid_error_id_ >()( t, method, value, id ); return false; }
static int rmd320_compress(hash_state *md, unsigned char *buf) #endif { ulong32 aa,bb,cc,dd,ee,aaa,bbb,ccc,ddd,eee,tmp,X[16]; int i; /* load words X */ for (i = 0; i < 16; i++){ LOAD32L(X[i], buf + (4 * i)); } /* load state */ aa = md->rmd320.state[0]; bb = md->rmd320.state[1]; cc = md->rmd320.state[2]; dd = md->rmd320.state[3]; ee = md->rmd320.state[4]; aaa = md->rmd320.state[5]; bbb = md->rmd320.state[6]; ccc = md->rmd320.state[7]; ddd = md->rmd320.state[8]; eee = md->rmd320.state[9]; /* round 1 */ FF(aa, bb, cc, dd, ee, X[ 0], 11); FF(ee, aa, bb, cc, dd, X[ 1], 14); FF(dd, ee, aa, bb, cc, X[ 2], 15); FF(cc, dd, ee, aa, bb, X[ 3], 12); FF(bb, cc, dd, ee, aa, X[ 4], 5); FF(aa, bb, cc, dd, ee, X[ 5], 8); FF(ee, aa, bb, cc, dd, X[ 6], 7); FF(dd, ee, aa, bb, cc, X[ 7], 9); FF(cc, dd, ee, aa, bb, X[ 8], 11); FF(bb, cc, dd, ee, aa, X[ 9], 13); FF(aa, bb, cc, dd, ee, X[10], 14); FF(ee, aa, bb, cc, dd, X[11], 15); FF(dd, ee, aa, bb, cc, X[12], 6); FF(cc, dd, ee, aa, bb, X[13], 7); FF(bb, cc, dd, ee, aa, X[14], 9); FF(aa, bb, cc, dd, ee, X[15], 8); /* parallel round 1 */ JJJ(aaa, bbb, ccc, ddd, eee, X[ 5], 8); JJJ(eee, aaa, bbb, ccc, ddd, X[14], 9); JJJ(ddd, eee, aaa, bbb, ccc, X[ 7], 9); JJJ(ccc, ddd, eee, aaa, bbb, X[ 0], 11); JJJ(bbb, ccc, ddd, eee, aaa, X[ 9], 13); JJJ(aaa, bbb, ccc, ddd, eee, X[ 2], 15); JJJ(eee, aaa, bbb, ccc, ddd, X[11], 15); JJJ(ddd, eee, aaa, bbb, ccc, X[ 4], 5); JJJ(ccc, ddd, eee, aaa, bbb, X[13], 7); JJJ(bbb, ccc, ddd, eee, aaa, X[ 6], 7); JJJ(aaa, bbb, ccc, ddd, eee, X[15], 8); JJJ(eee, aaa, bbb, ccc, ddd, X[ 8], 11); JJJ(ddd, eee, aaa, bbb, ccc, X[ 1], 14); JJJ(ccc, ddd, eee, aaa, bbb, X[10], 14); JJJ(bbb, ccc, ddd, eee, aaa, X[ 3], 12); JJJ(aaa, bbb, ccc, ddd, eee, X[12], 6); tmp = aa; aa = aaa; aaa = tmp; /* round 2 */ GG(ee, aa, bb, cc, dd, X[ 7], 7); GG(dd, ee, aa, bb, cc, X[ 4], 6); GG(cc, dd, ee, aa, bb, X[13], 8); GG(bb, cc, dd, ee, aa, X[ 1], 13); GG(aa, bb, cc, dd, ee, X[10], 11); GG(ee, aa, bb, cc, dd, X[ 6], 9); GG(dd, ee, aa, bb, cc, X[15], 7); GG(cc, dd, ee, aa, bb, X[ 3], 15); GG(bb, cc, dd, ee, aa, X[12], 7); GG(aa, bb, cc, dd, ee, X[ 0], 12); GG(ee, aa, bb, cc, dd, X[ 9], 15); GG(dd, ee, aa, bb, cc, X[ 5], 9); GG(cc, dd, ee, aa, bb, X[ 2], 11); GG(bb, cc, dd, ee, aa, X[14], 7); GG(aa, bb, cc, dd, ee, X[11], 13); GG(ee, aa, bb, cc, dd, X[ 8], 12); /* parallel round 2 */ III(eee, aaa, bbb, ccc, ddd, X[ 6], 9); III(ddd, eee, aaa, bbb, ccc, X[11], 13); III(ccc, ddd, eee, aaa, bbb, X[ 3], 15); III(bbb, ccc, ddd, eee, aaa, X[ 7], 7); III(aaa, bbb, ccc, ddd, eee, X[ 0], 12); III(eee, aaa, bbb, ccc, ddd, X[13], 8); III(ddd, eee, aaa, bbb, ccc, X[ 5], 9); III(ccc, ddd, eee, aaa, bbb, X[10], 11); III(bbb, ccc, ddd, eee, aaa, X[14], 7); III(aaa, bbb, ccc, ddd, eee, X[15], 7); III(eee, aaa, bbb, ccc, ddd, X[ 8], 12); III(ddd, eee, aaa, bbb, ccc, X[12], 7); III(ccc, ddd, eee, aaa, bbb, X[ 4], 6); III(bbb, ccc, ddd, eee, aaa, X[ 9], 15); III(aaa, bbb, ccc, ddd, eee, X[ 1], 13); III(eee, aaa, bbb, ccc, ddd, X[ 2], 11); tmp = bb; bb = bbb; bbb = tmp; /* round 3 */ HH(dd, ee, aa, bb, cc, X[ 3], 11); HH(cc, dd, ee, aa, bb, X[10], 13); HH(bb, cc, dd, ee, aa, X[14], 6); HH(aa, bb, cc, dd, ee, X[ 4], 7); HH(ee, aa, bb, cc, dd, X[ 9], 14); HH(dd, ee, aa, bb, cc, X[15], 9); HH(cc, dd, ee, aa, bb, X[ 8], 13); HH(bb, cc, dd, ee, aa, X[ 1], 15); HH(aa, bb, cc, dd, ee, X[ 2], 14); HH(ee, aa, bb, cc, dd, X[ 7], 8); HH(dd, ee, aa, bb, cc, X[ 0], 13); HH(cc, dd, ee, aa, bb, X[ 6], 6); HH(bb, cc, dd, ee, aa, X[13], 5); HH(aa, bb, cc, dd, ee, X[11], 12); HH(ee, aa, bb, cc, dd, X[ 5], 7); HH(dd, ee, aa, bb, cc, X[12], 5); /* parallel round 3 */ HHH(ddd, eee, aaa, bbb, ccc, X[15], 9); HHH(ccc, ddd, eee, aaa, bbb, X[ 5], 7); HHH(bbb, ccc, ddd, eee, aaa, X[ 1], 15); HHH(aaa, bbb, ccc, ddd, eee, X[ 3], 11); HHH(eee, aaa, bbb, ccc, ddd, X[ 7], 8); HHH(ddd, eee, aaa, bbb, ccc, X[14], 6); HHH(ccc, ddd, eee, aaa, bbb, X[ 6], 6); HHH(bbb, ccc, ddd, eee, aaa, X[ 9], 14); HHH(aaa, bbb, ccc, ddd, eee, X[11], 12); HHH(eee, aaa, bbb, ccc, ddd, X[ 8], 13); HHH(ddd, eee, aaa, bbb, ccc, X[12], 5); HHH(ccc, ddd, eee, aaa, bbb, X[ 2], 14); HHH(bbb, ccc, ddd, eee, aaa, X[10], 13); HHH(aaa, bbb, ccc, ddd, eee, X[ 0], 13); HHH(eee, aaa, bbb, ccc, ddd, X[ 4], 7); HHH(ddd, eee, aaa, bbb, ccc, X[13], 5); tmp = cc; cc = ccc; ccc = tmp; /* round 4 */ II(cc, dd, ee, aa, bb, X[ 1], 11); II(bb, cc, dd, ee, aa, X[ 9], 12); II(aa, bb, cc, dd, ee, X[11], 14); II(ee, aa, bb, cc, dd, X[10], 15); II(dd, ee, aa, bb, cc, X[ 0], 14); II(cc, dd, ee, aa, bb, X[ 8], 15); II(bb, cc, dd, ee, aa, X[12], 9); II(aa, bb, cc, dd, ee, X[ 4], 8); II(ee, aa, bb, cc, dd, X[13], 9); II(dd, ee, aa, bb, cc, X[ 3], 14); II(cc, dd, ee, aa, bb, X[ 7], 5); II(bb, cc, dd, ee, aa, X[15], 6); II(aa, bb, cc, dd, ee, X[14], 8); II(ee, aa, bb, cc, dd, X[ 5], 6); II(dd, ee, aa, bb, cc, X[ 6], 5); II(cc, dd, ee, aa, bb, X[ 2], 12); /* parallel round 4 */ GGG(ccc, ddd, eee, aaa, bbb, X[ 8], 15); GGG(bbb, ccc, ddd, eee, aaa, X[ 6], 5); GGG(aaa, bbb, ccc, ddd, eee, X[ 4], 8); GGG(eee, aaa, bbb, ccc, ddd, X[ 1], 11); GGG(ddd, eee, aaa, bbb, ccc, X[ 3], 14); GGG(ccc, ddd, eee, aaa, bbb, X[11], 14); GGG(bbb, ccc, ddd, eee, aaa, X[15], 6); GGG(aaa, bbb, ccc, ddd, eee, X[ 0], 14); GGG(eee, aaa, bbb, ccc, ddd, X[ 5], 6); GGG(ddd, eee, aaa, bbb, ccc, X[12], 9); GGG(ccc, ddd, eee, aaa, bbb, X[ 2], 12); GGG(bbb, ccc, ddd, eee, aaa, X[13], 9); GGG(aaa, bbb, ccc, ddd, eee, X[ 9], 12); GGG(eee, aaa, bbb, ccc, ddd, X[ 7], 5); GGG(ddd, eee, aaa, bbb, ccc, X[10], 15); GGG(ccc, ddd, eee, aaa, bbb, X[14], 8); tmp = dd; dd = ddd; ddd = tmp; /* round 5 */ JJ(bb, cc, dd, ee, aa, X[ 4], 9); JJ(aa, bb, cc, dd, ee, X[ 0], 15); JJ(ee, aa, bb, cc, dd, X[ 5], 5); JJ(dd, ee, aa, bb, cc, X[ 9], 11); JJ(cc, dd, ee, aa, bb, X[ 7], 6); JJ(bb, cc, dd, ee, aa, X[12], 8); JJ(aa, bb, cc, dd, ee, X[ 2], 13); JJ(ee, aa, bb, cc, dd, X[10], 12); JJ(dd, ee, aa, bb, cc, X[14], 5); JJ(cc, dd, ee, aa, bb, X[ 1], 12); JJ(bb, cc, dd, ee, aa, X[ 3], 13); JJ(aa, bb, cc, dd, ee, X[ 8], 14); JJ(ee, aa, bb, cc, dd, X[11], 11); JJ(dd, ee, aa, bb, cc, X[ 6], 8); JJ(cc, dd, ee, aa, bb, X[15], 5); JJ(bb, cc, dd, ee, aa, X[13], 6); /* parallel round 5 */ FFF(bbb, ccc, ddd, eee, aaa, X[12] , 8); FFF(aaa, bbb, ccc, ddd, eee, X[15] , 5); FFF(eee, aaa, bbb, ccc, ddd, X[10] , 12); FFF(ddd, eee, aaa, bbb, ccc, X[ 4] , 9); FFF(ccc, ddd, eee, aaa, bbb, X[ 1] , 12); FFF(bbb, ccc, ddd, eee, aaa, X[ 5] , 5); FFF(aaa, bbb, ccc, ddd, eee, X[ 8] , 14); FFF(eee, aaa, bbb, ccc, ddd, X[ 7] , 6); FFF(ddd, eee, aaa, bbb, ccc, X[ 6] , 8); FFF(ccc, ddd, eee, aaa, bbb, X[ 2] , 13); FFF(bbb, ccc, ddd, eee, aaa, X[13] , 6); FFF(aaa, bbb, ccc, ddd, eee, X[14] , 5); FFF(eee, aaa, bbb, ccc, ddd, X[ 0] , 15); FFF(ddd, eee, aaa, bbb, ccc, X[ 3] , 13); FFF(ccc, ddd, eee, aaa, bbb, X[ 9] , 11); FFF(bbb, ccc, ddd, eee, aaa, X[11] , 11); tmp = ee; ee = eee; eee = tmp; /* combine results */ md->rmd320.state[0] += aa; md->rmd320.state[1] += bb; md->rmd320.state[2] += cc; md->rmd320.state[3] += dd; md->rmd320.state[4] += ee; md->rmd320.state[5] += aaa; md->rmd320.state[6] += bbb; md->rmd320.state[7] += ccc; md->rmd320.state[8] += ddd; md->rmd320.state[9] += eee; return CRYPT_OK; }
void CURRENT::pbc() { // add all the field of the "current" field of the periodic boundary region so // that the contribution J(0)=J(0)+J(N-1) J(N-1)=J(0) and J(1)=J(1)+J(Nx) // same is done also for the charge density components of the field int i, j, k, c; int Nx, Ny, Nz, Nc = Ncomp; int Ngx, Ngy, Ngz, sendcount; int dimensions = mygrid->getDimensionality(); int edge = mygrid->getEdge(); int Nxchng = 2 * edge + 1;//, istart=(Nxchng-1)/2; // number of points to exchange // (i.e. -2,-1,0,1,2 e.g istart, istart+1,istart+2,istart+3,istart+(Nxchng-1) double *send_buffer, *recv_buffer; MPI_Status status; int iright, ileft; Nx = mygrid->Nloc[0]; Ny = mygrid->Nloc[1]; Nz = mygrid->Nloc[2]; Ngx = N_grid[0]; Ngy = N_grid[1]; Ngz = N_grid[2]; if (dimensions == 3) { //send boundaries along z sendcount = Ngx*Ngy*Nxchng*Nc; send_buffer = (double *)malloc(sendcount*sizeof(double)); recv_buffer = (double *)malloc(sendcount*sizeof(double)); // ====== send right: send_buff=right_edge for (k = 0; k < Nxchng; k++) for (j = 0; j < Ngy; j++) for (i = 0; i < Ngx; i++) for (c = 0; c < Nc; c++) { send_buffer[c + i*Nc + j*Nc*Ngx + k*Nc*Ngx*Ngy] = JJ(c, i - edge, j - edge, (Nz - 1) - edge + k); } // ====== send edge to right receive from left MPI_Cart_shift(mygrid->cart_comm, 2, 1, &ileft, &iright); memset((void*)recv_buffer, 0, sendcount*sizeof(double)); MPI_Sendrecv(send_buffer, sendcount, MPI_DOUBLE, iright, 13, recv_buffer, sendcount, MPI_DOUBLE, ileft, 13, MPI_COMM_WORLD, &status); // ====== add recv_buffer to left_edge and send back to left the result for (k = 0; k < Nxchng; k++) for (j = 0; j < Ngy; j++) for (i = 0; i < Ngx; i++) for (c = 0; c < Nc; c++) { JJ(c, i - edge, j - edge, k - edge) += recv_buffer[c + i*Nc + j*Nc*Ngx + k*Nc*Ngx*Ngy]; send_buffer[c + i*Nc + j*Nc*Ngx + k*Nc*Ngx*Ngy] = JJ(c, i - edge, j - edge, k - edge); } // ====== send to left receive from right memset((void*)recv_buffer, 0, sendcount*sizeof(double)); MPI_Sendrecv(send_buffer, sendcount, MPI_DOUBLE, ileft, 13, recv_buffer, sendcount, MPI_DOUBLE, iright, 13, MPI_COMM_WORLD, &status); // ====== copy recv_buffer to the right edge for (k = 0; k < Nxchng; k++) for (j = 0; j < Ngy; j++) for (i = 0; i < Ngx; i++) for (c = 0; c < Nc; c++) { JJ(c, i - edge, j - edge, (Nz - 1) - edge + k) = recv_buffer[c + i*Nc + j*Nc*Ngx + k*Nc*Ngx*Ngy]; } // ===== finished, now free the send recv buffers free(send_buffer); free(recv_buffer); } if (dimensions >= 2) { // =============== send boundaries along y ============ sendcount = Ngx*Nxchng*Ngz*Nc; send_buffer = (double *)malloc(sendcount*sizeof(double)); recv_buffer = (double *)malloc(sendcount*sizeof(double)); // ====== send right: send_buff=right_edge for (k = 0; k < Ngz; k++) for (j = 0; j < Nxchng; j++) for (i = 0; i < Ngx; i++) for (c = 0; c < Nc; c++) { send_buffer[c + i*Nc + j*Nc*Ngx + k*Nc*Ngx*Nxchng] = JJ(c, i - edge, (Ny - 1) - edge + j, k - edge); } // ====== send edge to right receive from left MPI_Cart_shift(mygrid->cart_comm, 1, 1, &ileft, &iright); memset((void*)recv_buffer, 0, sendcount*sizeof(double)); MPI_Sendrecv(send_buffer, sendcount, MPI_DOUBLE, iright, 13, recv_buffer, sendcount, MPI_DOUBLE, ileft, 13, MPI_COMM_WORLD, &status); // ====== add recv_buffer to left_edge and send back to left the result for (k = 0; k < Ngz; k++) for (j = 0; j < Nxchng; j++) for (i = 0; i < Ngx; i++) for (c = 0; c < Nc; c++) { JJ(c, i - edge, j - edge, k - edge) += recv_buffer[c + i*Nc + j*Nc*Ngx + k*Nc*Ngx*Nxchng]; send_buffer[c + i*Nc + j*Nc*Ngx + k*Nc*Ngx*Nxchng] = JJ(c, i - edge, j - edge, k - edge); } // ====== send to left receive from right memset((void*)recv_buffer, 0, sendcount*sizeof(double)); MPI_Sendrecv(send_buffer, sendcount, MPI_DOUBLE, ileft, 13, recv_buffer, sendcount, MPI_DOUBLE, iright, 13, MPI_COMM_WORLD, &status); // ====== copy recv_buffer to the right edge for (k = 0; k < Ngz; k++) for (j = 0; j < Nxchng; j++) for (i = 0; i < Ngx; i++) for (c = 0; c < Nc; c++) { JJ(c, i - edge, (Ny - 1) - edge + j, k - edge) = recv_buffer[c + i*Nc + j*Nc*Ngx + k*Nc*Ngx*Nxchng]; } // ===== finished, now free the send recv buffers free(send_buffer); free(recv_buffer); } //send boundaries along x sendcount = Nxchng*Ngy*Ngz*Nc; send_buffer = (double *)malloc(sendcount*sizeof(double)); recv_buffer = (double *)malloc(sendcount*sizeof(double)); // ====== send right: send_buff=right_edge for (k = 0; k < Ngz; k++) for (j = 0; j < Ngy; j++) for (i = 0; i < Nxchng; i++) for (c = 0; c < Nc; c++) { send_buffer[c + i*Nc + j*Nc*Nxchng + k*Nc*Nxchng*Ngy] = JJ(c, (Nx - 1) - edge + i, j - edge, k - edge); } // ====== send edge to right receive from left MPI_Cart_shift(mygrid->cart_comm, 0, 1, &ileft, &iright); memset((void*)recv_buffer, 0, sendcount*sizeof(double)); MPI_Sendrecv(send_buffer, sendcount, MPI_DOUBLE, iright, 13, recv_buffer, sendcount, MPI_DOUBLE, ileft, 13, MPI_COMM_WORLD, &status); // ====== add recv_buffer to left_edge and send back to left the result for (k = 0; k < Ngz; k++) for (j = 0; j < Ngy; j++) for (i = 0; i < Nxchng; i++) for (c = 0; c < Nc; c++) { JJ(c, i - edge, j - edge, k - edge) += recv_buffer[c + i*Nc + j*Nc*Nxchng + k*Nc*Nxchng*Ngy]; send_buffer[c + i*Nc + j*Nc*Nxchng + k*Nc*Nxchng*Ngy] = JJ(c, i - edge, j - edge, k - edge); } // ====== send to left receive from right memset((void*)recv_buffer, 0, sendcount*sizeof(double)); MPI_Sendrecv(send_buffer, sendcount, MPI_DOUBLE, ileft, 13, recv_buffer, sendcount, MPI_DOUBLE, iright, 13, MPI_COMM_WORLD, &status); // ====== copy recv_buffer to the right edge for (k = 0; k < Ngz; k++) for (j = 0; j < Ngy; j++) for (i = 0; i < Nxchng; i++) for (c = 0; c < Nc; c++) { JJ(c, (Nx - 1) - edge + i, j - edge, k - edge) = recv_buffer[c + i*Nc + j*Nc*Nxchng + k*Nc*Nxchng*Ngy]; } // ===== finished, now free the send recv buffers free(send_buffer); free(recv_buffer); }
STATIC void print_jobject(const mp_print_t *print, jobject obj) { jobject str_o = JJ(CallObjectMethod, obj, Object_toString_mid); const char *str = JJ(GetStringUTFChars, str_o, NULL); mp_printf(print, str); JJ(ReleaseStringUTFChars, str_o, str); }
STATIC bool py2jvalue(const char **jtypesig, mp_obj_t arg, jvalue *out) { const char *arg_type = *jtypesig; mp_obj_type_t *type = mp_obj_get_type(arg); if (type == &mp_type_str) { if (IMATCH(arg_type, "java.lang.String") || IMATCH(arg_type, "java.lang.Object")) { out->l = JJ(NewStringUTF, mp_obj_str_get_str(arg)); } else { return false; } } else if (type == &mp_type_int) { if (IMATCH(arg_type, "int") || IMATCH(arg_type, "long")) { // TODO: Java long is 64-bit actually out->j = mp_obj_get_int(arg); } else { return false; } } else if (type == &jobject_type) { bool is_object = false; const char *expected_type = arg_type; while (1) { if (isalpha(*arg_type)) { } else if (*arg_type == '.') { is_object = true; } else { break; } arg_type++; } if (!is_object) { return false; } mp_obj_jobject_t *jo = arg; if (!MATCH(expected_type, "java.lang.Object")) { char class_name[64]; get_jclass_name(jo->obj, class_name); //printf("Arg class: %s\n", class_name); if (strcmp(class_name, expected_type) != 0) { return false; } } out->l = jo->obj; } else if (type == &mp_type_bool) { if (IMATCH(arg_type, "boolean")) { out->z = arg == mp_const_true; } else { return false; } } else if (arg == mp_const_none) { //printf("TODO: Check java arg type!!\n"); while (isalpha(*arg_type) || *arg_type == '.') { arg_type++; } out->l = NULL; } else { nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "arg type not supported")); } *jtypesig = arg_type; return true; }
STATIC mp_obj_t call_method(jobject obj, const char *name, jarray methods, bool is_constr, mp_uint_t n_args, const mp_obj_t *args) { jvalue jargs[n_args]; // printf("methods=%p\n", methods); jsize num_methods = JJ(GetArrayLength, methods); for (int i = 0; i < num_methods; i++) { jobject meth = JJ(GetObjectArrayElement, methods, i); jobject name_o = JJ(CallObjectMethod, meth, Object_toString_mid); const char *decl = JJ(GetStringUTFChars, name_o, NULL); const char *arg_types = strchr(decl, '(') + 1; //const char *arg_types_end = strchr(arg_types, ')'); // printf("method[%d]=%p %s\n", i, meth, decl); const char *meth_name = NULL; const char *ret_type = NULL; if (!is_constr) { meth_name = strprev(arg_types, '.') + 1; ret_type = strprev(meth_name, ' ') - 1; ret_type = strprev(ret_type, ' ') + 1; int name_len = strlen(name); if (strncmp(name, meth_name, name_len/*arg_types - meth_name - 1*/) || meth_name[name_len] != '('/*(*/) { goto next_method; } } // printf("method[%d]=%p %s\n", i, meth, decl); // printf("!!!%s\n", arg_types); // printf("name=%p meth_name=%s\n", name, meth_name); bool found = true; for (int i = 0; i < n_args && *arg_types != ')'; i++) { if (!py2jvalue(&arg_types, args[i], &jargs[i])) { goto next_method; } if (*arg_types == ',') { arg_types++; } } if (*arg_types != ')') { goto next_method; } if (found) { // printf("found!\n"); jmethodID method_id = JJ(FromReflectedMethod, meth); jobject res; mp_obj_t ret; if (is_constr) { JJ(ReleaseStringUTFChars, name_o, decl); res = JJ(NewObjectA, obj, method_id, jargs); return new_jobject(res); } else { if (MATCH(ret_type, "void")) { JJ(CallVoidMethodA, obj, method_id, jargs); check_exception(); ret = mp_const_none; } else if (MATCH(ret_type, "int")) { jint res = JJ(CallIntMethodA, obj, method_id, jargs); check_exception(); ret = mp_obj_new_int(res); } else if (MATCH(ret_type, "boolean")) { jboolean res = JJ(CallBooleanMethodA, obj, method_id, jargs); check_exception(); ret = mp_obj_new_bool(res); } else if (is_object_type(ret_type)) { res = JJ(CallObjectMethodA, obj, method_id, jargs); check_exception(); ret = new_jobject(res); } else { JJ(ReleaseStringUTFChars, name_o, decl); nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "cannot handle return type")); } JJ(ReleaseStringUTFChars, name_o, decl); JJ(DeleteLocalRef, name_o); JJ(DeleteLocalRef, meth); return ret; } } next_method: JJ(ReleaseStringUTFChars, name_o, decl); JJ(DeleteLocalRef, name_o); JJ(DeleteLocalRef, meth); } nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "method not found")); }