📄 cal_value.c
字号:
int k ; struct Value V3 ; GetDP_Begin("Cal_DivideValue"); if ( (V1->Type == SCALAR) && (V2->Type == SCALAR) ) { if (Current.NbrHar == 1) { R->Val[0] = V1->Val[0]/V2->Val[0]; } else { for (k = 0 ; k < Current.NbrHar ; k += 2) { /* meaning in multi-harmonics ??? */ CDIVI(0,0,0); CPUT(0); } } R->Type = SCALAR ; } else if ( (V1->Type == VECTOR || V1->Type == TENSOR_DIAG) && (V2->Type == SCALAR) ) { if (Current.NbrHar == 1) { a0 = V2->Val[0] ; R->Val[0] = V1->Val[0] / a0 ; R->Val[1] = V1->Val[1] / a0 ; R->Val[2] = V1->Val[2] / a0 ; } else { for (k = 0 ; k < Current.NbrHar ; k += 2) { CDIVI(0,0,0); CDIVI(1,0,1); CDIVI(2,0,2); CPUT(0); CPUT(1); CPUT(2); } } R->Type = V1->Type ; } else if ( (V1->Type == TENSOR_SYM) && (V2->Type == SCALAR) ) { if (Current.NbrHar == 1) { a0 = V2->Val[0] ; R->Val[0] = V1->Val[0] / a0 ; R->Val[1] = V1->Val[1] / a0 ; R->Val[2] = V1->Val[2] / a0 ; R->Val[3] = V1->Val[3] / a0 ; R->Val[4] = V1->Val[4] / a0 ; R->Val[5] = V1->Val[5] / a0 ; } else { for (k = 0 ; k < Current.NbrHar ; k += 2) { CDIVI(0,0,0); CDIVI(1,0,1); CDIVI(2,0,2); CDIVI(3,0,3); CDIVI(4,0,4); CDIVI(5,0,5); CPUT(0); CPUT(1); CPUT(2); CPUT(3); CPUT(4); CPUT(5); } } R->Type = TENSOR_SYM ; } else if ( (V1->Type == TENSOR) && (V2->Type == SCALAR) ) { if (Current.NbrHar == 1) { a0 = V2->Val[0] ; R->Val[0] = V1->Val[0] / a0 ; R->Val[1] = V1->Val[1] / a0 ; R->Val[2] = V1->Val[2] / a0 ; R->Val[3] = V1->Val[3] / a0 ; R->Val[4] = V1->Val[4] / a0 ; R->Val[5] = V1->Val[5] / a0 ; R->Val[6] = V1->Val[6] / a0 ; R->Val[7] = V1->Val[7] / a0 ; R->Val[8] = V1->Val[8] / a0 ; } else { for (k = 0 ; k < Current.NbrHar ; k += 2) { CDIVI(0,0,0); CDIVI(1,0,1); CDIVI(2,0,2); CDIVI(3,0,3); CDIVI(4,0,4); CDIVI(5,0,5); CDIVI(6,0,6); CDIVI(7,0,7); CDIVI(8,0,8); CPUT(0); CPUT(1); CPUT(2); CPUT(3); CPUT(4); CPUT(5); CPUT(6); CPUT(7); CPUT(8); } } R->Type = TENSOR ; } else if ( (V1->Type == SCALAR) && (V2->Type == TENSOR || V2->Type == TENSOR_SYM || V2->Type == TENSOR_DIAG) ) { Cal_InvertValue(V2,&V3); Cal_ProductValue(V1,&V3,R); } else { Msg(GERROR, "Division of non adapted quantities: %s / %s", Get_StringForDefine(Field_Type, V1->Type), Get_StringForDefine(Field_Type, V2->Type)); } GetDP_End ;}#undef CDIVI#undef CPUT/* ------------------------------------------------------------------------ R <- V1 % V2 ------------------------------------------------------------------------ */void Cal_ModuloValue (struct Value * V1, struct Value * V2, struct Value * R) { int k ; GetDP_Begin("Cal_ModuloValue"); if ( (V1->Type == SCALAR) && (V2->Type == SCALAR) ) { for (k = 0 ; k < Current.NbrHar ; k += 2) { R->Val[MAX_DIM* k ] = (int)V1->Val[MAX_DIM*k] % (int)V2->Val[MAX_DIM*k] ; R->Val[MAX_DIM*(k+1)] = 0. ; } R->Type = SCALAR ; } else if ( (V1->Type == VECTOR) && (V2->Type == SCALAR) ) { for (k = 0 ; k < Current.NbrHar ; k += 2) { R->Val[MAX_DIM* k ] = (int)V1->Val[MAX_DIM*k ] % (int)V2->Val[MAX_DIM*k ] ; R->Val[MAX_DIM* k +1] = (int)V1->Val[MAX_DIM*k+1] % (int)V2->Val[MAX_DIM*k+1] ; R->Val[MAX_DIM* k +2] = (int)V1->Val[MAX_DIM*k+2] % (int)V2->Val[MAX_DIM*k+2] ; R->Val[MAX_DIM*(k+1)] = 0. ; R->Val[MAX_DIM*(k+1)+1] = 0. ; R->Val[MAX_DIM*(k+1)+2] = 0. ; } R->Type = VECTOR ; } else { Msg(GERROR, "Modulo of non adapted quantities: %s %% %s", Get_StringForDefine(Field_Type, V1->Type), Get_StringForDefine(Field_Type, V2->Type)); } GetDP_End ;}/* ------------------------------------------------------------------------ R <- V1 X V2 ------------------------------------------------------------------------ */void Cal_CrossProductValue (struct Value * V1, struct Value * V2, struct Value * R) { int k ; GetDP_Begin("Cal_CrossProductValue"); if ( (V1->Type == VECTOR) && (V2->Type == VECTOR) ) { if (Current.NbrHar == 1) { a1[0] = V1->Val[1] * V2->Val[2] - V1->Val[2] * V2->Val[1] ; a1[1] = V1->Val[2] * V2->Val[0] - V1->Val[0] * V2->Val[2] ; a1[2] = V1->Val[0] * V2->Val[1] - V1->Val[1] * V2->Val[0] ; R->Val[0] = a1[0] ; R->Val[1] = a1[1] ; R->Val[2] = a1[2] ; } else { for (k = 0 ; k < Current.NbrHar ; k += 2) { Cal_ComplexProduct(&(V1->Val[MAX_DIM*k+1]), &(V2->Val[MAX_DIM*k+2]), a1) ; Cal_ComplexProduct(&(V1->Val[MAX_DIM*k+2]), &(V2->Val[MAX_DIM*k+1]), a2) ; b1[0] = a1[0] - a2[0] ; b1[MAX_DIM] = a1[MAX_DIM] - a2[MAX_DIM] ; Cal_ComplexProduct(&(V1->Val[MAX_DIM*k+2]), &(V2->Val[MAX_DIM*k ]), a1) ; Cal_ComplexProduct(&(V1->Val[MAX_DIM*k ]), &(V2->Val[MAX_DIM*k+2]), a2) ; b2[0] = a1[0] - a2[0] ; b2[MAX_DIM] = a1[MAX_DIM] - a2[MAX_DIM] ; Cal_ComplexProduct(&(V1->Val[MAX_DIM*k ]), &(V2->Val[MAX_DIM*k+1]), a1) ; Cal_ComplexProduct(&(V1->Val[MAX_DIM*k+1]), &(V2->Val[MAX_DIM*k ]), a2) ; b3[0] = a1[0] - a2[0] ; b3[MAX_DIM] = a1[MAX_DIM] - a2[MAX_DIM] ; R->Val[MAX_DIM*k ] = b1[0] ; R->Val[MAX_DIM*(k+1) ] = b1[MAX_DIM] ; R->Val[MAX_DIM*k+1] = b2[0] ; R->Val[MAX_DIM*(k+1)+1] = b2[MAX_DIM] ; R->Val[MAX_DIM*k+2] = b3[0] ; R->Val[MAX_DIM*(k+1)+2] = b3[MAX_DIM] ; } } R->Type = VECTOR ; } else { Msg(GERROR, "Cross product of non vector quantities: %s /\\ %s", Get_StringForDefine(Field_Type, V1->Type), Get_StringForDefine(Field_Type, V2->Type)); } GetDP_End ;}/* ------------------------------------------------------------------------ R <- V1 ^ V2 ------------------------------------------------------------------------ */void Cal_PowerValue (struct Value * V1, struct Value * V2, struct Value * R) { int k; double arg, abs ; GetDP_Begin("Cal_PowerValue"); if ( V1->Type == SCALAR && V2->Type == SCALAR ){ if(V2->Val[0] == 1.){ Cal_CopyValue(V1,R) ; } if(V2->Val[0] == 2.){ if (Current.NbrHar == 1) { R->Val[0] = DSQU(V1->Val[0]) ; } else{ for (k = 0 ; k < Current.NbrHar ; k+=2) { Cal_ComplexProduct(&(V1->Val[MAX_DIM*k]), &(V1->Val[MAX_DIM*k]), a1) ; R->Val[MAX_DIM* k ] = a1[0]; R->Val[MAX_DIM*(k+1)] = a1[MAX_DIM]; } } } else{ if (Current.NbrHar == 1) { R->Val[0] = pow(V1->Val[0],V2->Val[0]) ; } else{ for (k = 0 ; k < Current.NbrHar ; k+=2) { abs = pow(sqrt(DSQU(V1->Val[MAX_DIM*k])+DSQU(V1->Val[MAX_DIM*(k+1)])), V2->Val[0]) ; arg = atan2(V1->Val[MAX_DIM*(k+1)], V1->Val[MAX_DIM*k]) ; R->Val[MAX_DIM* k ] = abs * cos(V2->Val[0] * arg) ; R->Val[MAX_DIM*(k+1)] = abs * sin(V2->Val[0] * arg) ; } } } R->Type = SCALAR ; } else { Msg(GERROR, "Power of non scalar quantities: %s ^ %s", Get_StringForDefine(Field_Type, V1->Type), Get_StringForDefine(Field_Type, V2->Type)); } GetDP_End ;}/* ------------------------------------------------------------------------ R <- V1 < V2 ------------------------------------------------------------------------ */void Cal_LessValue (struct Value * V1, struct Value * V2, struct Value * R) { GetDP_Begin("Cal_LessValue"); if ( (V1->Type == SCALAR) && (V2->Type == SCALAR) ) { R->Val[0] = (V1->Val[0] < V2->Val[0]) ; R->Type = SCALAR ; } else { Msg(GERROR, "Comparison of non scalar quantities: %s < %s", Get_StringForDefine(Field_Type, V1->Type), Get_StringForDefine(Field_Type, V2->Type)); } GetDP_End ;}/* ------------------------------------------------------------------------ R <- V1 <= V2 ------------------------------------------------------------------------ */void Cal_LessOrEqualValue (struct Value * V1, struct Value * V2, struct Value * R) { GetDP_Begin("Cal_LessOrEqualValue"); if ( (V1->Type == SCALAR) && (V2->Type == SCALAR) ) { R->Val[0] = (V1->Val[0] <= V2->Val[0]) ; R->Type = SCALAR ; } else { Msg(GERROR, "Comparison of non scalar quantities: %s <= %s", Get_StringForDefine(Field_Type, V1->Type), Get_StringForDefine(Field_Type, V2->Type)); } GetDP_End ;}/* ------------------------------------------------------------------------ R <- V1 > V2 ------------------------------------------------------------------------ */void Cal_GreaterValue (struct Value * V1, struct Value * V2, struct Value * R) { GetDP_Begin("Cal_GreaterValue"); if ( (V1->Type == SCALAR) && (V2->Type == SCALAR) ) { R->Val[0] = (V1->Val[0] > V2->Val[0]) ; R->Type = SCALAR ; } else { Msg(GERROR, "Comparison of non scalar quantities: %s > %s", Get_StringForDefine(Field_Type, V1->Type), Get_StringForDefine(Field_Type, V2->Type)); } GetDP_End ;}/* ------------------------------------------------------------------------ R <- V1 >= V2 ------------------------------------------------------------------------ */void Cal_GreaterOrEqualValue (struct Value * V1, struct Value * V2, struct Value * R) { GetDP_Begin("Cal_GreaterOrEqualValue"); if ( (V1->Type == SCALAR) && (V2->Type == SCALAR) ) { R->Val[0] = (V1->Val[0] >= V2->Val[0]) ; R->Type = SCALAR ; } else { Msg(GERROR, "Comparison of non scalar quantities: %s >= %s", Get_StringForDefine(Field_Type, V1->Type), Get_StringForDefine(Field_Type, V2->Type)); } GetDP_End ;}/* ------------------------------------------------------------------------ R <- V1 == V2 ------------------------------------------------------------------------ */void Cal_EqualValue (struct Value * V1, struct Value * V2, struct Value * R) { int k; GetDP_Begin("Cal_EqualValue"); if ( (V1->Type == SCALAR) && (V2->Type == SCALAR) ) { R->Val[0] = (V1->Val[0] == V2->Val[0]) ; for (k = 1 ; k < Current.NbrHar ; k++){ if(!R->Val[0]) break; R->Val[0] = (V1->Val[MAX_DIM*k] == V2->Val[MAX_DIM*k]) ; } R->Type = SCALAR ; } else if ( ( (V1->Type == VECTOR) && (V2->Type == VECTOR) ) || ( (V1->Type == TENSOR_DIAG) && (V2->Type == TENSOR_DIAG) ) ) { R->Val[0] = (V1->Val[0] == V2->Val[0] && V1->Val[1] == V2->Val[1] && V1->Val[2] == V2->Val[2]) ; for (k = 0 ; k < Current.NbrHar ; k++) { if(!R->Val[0]) break; R->Val[0] = (V1->Val[MAX_DIM*k ] == V2->Val[MAX_DIM*k ] && V1->Val[MAX_DIM*k+1] == V2->Val[MAX_DIM*k+1] && V1->Val[MAX_DIM*k+2] == V2->Val[MAX_DIM*k+2]) ; } R->Type = SCALAR ; } else if ( (V1->Type == TENSOR_SYM) && (V2->Type == TENSOR_SYM) ) { R->Val[0] = (V1->Val[0] == V2->Val[0] && V1->Val[1] == V2->Val[1] && V1->Val[2] == V2->Val[2] && V1->Val[3] == V2->Val[3] && V1->Val[4] == V2->Val[4] && V1->Val[5] == V2->Val[5]) ; for (k = 0 ; k < Current.NbrHar ; k++) { if(!R->Val[0]) break; R->Val[0] = (V1->Val[MAX_DIM*k ] == V2->Val[MAX_DIM*k ] && V1->Val[MAX_DIM*k+1] == V2->Val[MAX_DIM*k+1] && V1->Val[MAX_DIM*k+2] == V2->Val[MAX_DIM*k+2] && V1->Val[MAX_DIM*k+3] == V2->Val[MAX_DIM*k+3] && V1->Val[MAX_DIM*k+4] == V2->Val[MAX_DIM*k+4] && V1->Val[MAX_DIM*k+5] == V2->Val[MAX_DIM*k+5]) ; } R->Type = SCALAR ; } else if ( (V1->Type == TENSOR) && (V2->Type == TENSOR) ) { R->Val[0] = (V1->Val[0] == V2->Val[0] && V1->Val[1] == V2->Val[1] && V1->Val[2] == V2->Val[2] && V1->Val[3] == V2->Val[3] && V1->Val[4] == V2->Val[4] && V1->Val[5] == V2->Val[5] && V1->Val[6] == V2->Val[6] && V1->Val[7] == V2->Val[7] && V1->Val[8] == V2->Val[8]) ; for (k = 0 ; k < Current.NbrHar ; k++) { if(!R->Val[0]) break; R->Val[0] = (V1->Val[MAX_DIM*k ] == V2->Val[MAX_DIM*k ] && V1->Val[MAX_DIM*k+1] == V2->Val[MAX_DIM*k+1] && V1->Val[MAX_DIM*k+2] == V2->Val[MAX_DIM*k+2] && V1->Val[MAX_DIM*k+3] == V2->Val[MAX_DIM*k+3] && V1->Val[MAX_DIM*k+4] == V2->Val[MAX_DIM*k+4] && V1->Val[MAX_DIM*k+5] == V2->Val[MAX_DIM*k+5] && V1->Val[MAX_DIM*k+6] == V2->Val[MAX_DIM*k+6] && V1->Val[MAX_DIM*k+7] == V2->Val[MAX_DIM*k+7] && V1->Val[MAX_DIM*k+8] == V2->Val[MAX_DIM*k+8]) ; } R->Type = SCALAR ; } else { Msg(GERROR, "Comparison of different quantities: %s == %s", Get_StringForDefine(Field_Type, V1->Type), Get_StringForDefine(Field_Type, V2->Type)); } GetDP_End ;}/* ------------------------------------------------------------------------ R <- V1 != V2 ------------------------------------------------------------------------ */void Cal_NotEqualValue (struct Value * V1, struct Value * V2, struct Value * R) { int k; GetDP_Begin("Cal_NotEqualValue"); if ( (V1->Type == SCALAR) && (V2->Type == SCALAR) ) { R->Val[0] = (V1->Val[0] != V2->Val[0]) ; for (k = 1 ; k < Current.NbrHar ; k++){ if(R->Val[0]) break; R->Val[0] = (V1->Val[MAX_DIM*k] != V2->Val[MAX_DIM*k]) ; } R->Type = SCALAR ; } else if ( ( (V1->Type == VECTOR) && (V2->Type == VECTOR) ) || ( (V1->Type == TENSOR_DIAG) && (V2->Type == TENSOR_DIAG) ) ) { R->Val[0] = (V1->Val[0] != V2->Val[0] || V1->Val[1] != V2->Val[1] || V1->Val[2] != V2->Val[2]) ; for (k = 0 ; k < Current.NbrHar ; k++) { if(R->Val[0]) break; R->Val[0] = (V1->Val[MAX_DIM*k ] != V2->Val[MAX_DIM*k ] ||
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -