F_ExtMath.cpp (getdp-3.4.0-source.tgz) | : | F_ExtMath.cpp (getdp-3.5.0-source.tgz) | ||
---|---|---|---|---|
// GetDP - Copyright (C) 1997-2021 P. Dular and C. Geuzaine, University of Liege | // GetDP - Copyright (C) 1997-2022 P. Dular and C. Geuzaine, University of Liege | |||
// | // | |||
// See the LICENSE.txt file for license information. Please report all | // See the LICENSE.txt file for license information. Please report all | |||
// issues on https://gitlab.onelab.info/getdp/getdp/issues. | // issues on https://gitlab.onelab.info/getdp/getdp/issues. | |||
// | // | |||
// Contributor(s): | // Contributor(s): | |||
// Johan Gyselinck | // Johan Gyselinck | |||
// Ruth Sabariego | // Ruth Sabariego | |||
#include <math.h> | #include <math.h> | |||
#include "F.h" | #include "F.h" | |||
#include "GeoData.h" | #include "GeoData.h" | |||
#include "DofData.h" | #include "DofData.h" | |||
#include "Cal_Value.h" | #include "Cal_Value.h" | |||
#include "Message.h" | #include "Message.h" | |||
extern struct CurrentData Current ; | extern struct CurrentData Current; | |||
#define SQU(a) ((a)*(a)) | #define SQU(a) ((a) * (a)) | |||
#define TWO_PI 6.2831853071795865 | #define TWO_PI 6.2831853071795865 | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
/* Simple Extended Math */ | /* Simple Extended Math */ | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
void F_Hypot(F_ARG) | void F_Hypot(F_ARG) | |||
{ | { | |||
int k; | int k; | |||
double tmp; | double tmp; | |||
if(A->Type != SCALAR || (A+1)->Type != SCALAR) | if(A->Type != SCALAR || (A + 1)->Type != SCALAR) | |||
Message::Error("Non scalar argument(s) for function 'Hypot'"); | Message::Error("Non scalar argument(s) for function 'Hypot'"); | |||
if (Current.NbrHar == 1){ | if(Current.NbrHar == 1) { | |||
V->Val[0] = sqrt(A->Val[0]*A->Val[0]+(A+1)->Val[0]*(A+1)->Val[0]) ; | V->Val[0] = sqrt(A->Val[0] * A->Val[0] + (A + 1)->Val[0] * (A + 1)->Val[0]); | |||
} | } | |||
else { | else { | |||
tmp = sqrt(A->Val[0]*A->Val[0]+(A+1)->Val[0]*(A+1)->Val[0]) ; | tmp = sqrt(A->Val[0] * A->Val[0] + (A + 1)->Val[0] * (A + 1)->Val[0]); | |||
for (k = 0 ; k < Current.NbrHar ; k += 2) { | for(k = 0; k < Current.NbrHar; k += 2) { | |||
V->Val[MAX_DIM* k ] = tmp ; | V->Val[MAX_DIM * k] = tmp; | |||
V->Val[MAX_DIM*(k+1)] = 0. ; | V->Val[MAX_DIM * (k + 1)] = 0.; | |||
} | } | |||
} | } | |||
V->Type = SCALAR; | V->Type = SCALAR; | |||
} | } | |||
void F_TanhC2(F_ARG) | void F_TanhC2(F_ARG) | |||
{ | { | |||
// @Jon: check this and the behavior of the overall function for large args | // @Jon: check this and the behavior of the overall function for large args | |||
// lim_x\to\inf cosh(x) = +\inf | // lim_x\to\inf cosh(x) = +\inf | |||
// lim_x\to\inf sinh(x) = 1 | // lim_x\to\inf sinh(x) = 1 | |||
double denom = | double denom = SQU(cosh(A->Val[0]) * cos(A->Val[MAX_DIM])) + | |||
SQU(cosh(A->Val[0])*cos(A->Val[MAX_DIM])) + | SQU(sinh(A->Val[0]) * sin(A->Val[MAX_DIM])); | |||
SQU(sinh(A->Val[0])*sin(A->Val[MAX_DIM])); | // printf("arg=%g cosh(arg)=%g\n", A->Val[0], cosh(A->Val[0])); | |||
//printf("arg=%g cosh(arg)=%g\n", A->Val[0], cosh(A->Val[0])); | ||||
V->Val[0] = sinh(A->Val[0]) * cosh(A->Val[0]) / denom; | ||||
V->Val[0] = sinh(A->Val[0])*cosh(A->Val[0]) / denom ; | V->Val[MAX_DIM] = sin(A->Val[MAX_DIM]) * cos(A->Val[MAX_DIM]) / denom; | |||
V->Val[MAX_DIM] = sin(A->Val[MAX_DIM])*cos(A->Val[MAX_DIM]) / denom ; | V->Type = SCALAR; | |||
V->Type = SCALAR ; | ||||
/* printf("numer_real=%g, numer_imag=%g, denom = %g\n", | /* printf("numer_real=%g, numer_imag=%g, denom = %g\n", | |||
sinh(A->Val[0])*cosh(A->Val[0]) , | sinh(A->Val[0])*cosh(A->Val[0]) , | |||
sin(A->Val[MAX_DIM])*cos(A->Val[MAX_DIM]), | sin(A->Val[MAX_DIM])*cos(A->Val[MAX_DIM]), | |||
denom); */ | denom); */ | |||
} | } | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
/* General Tensor Functions */ | /* General Tensor Functions */ | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
void F_Transpose(F_ARG) | void F_Transpose(F_ARG) | |||
{ | { | |||
if(A->Type != TENSOR_DIAG && A->Type != TENSOR_SYM && A->Type != TENSOR) | if(A->Type != TENSOR_DIAG && A->Type != TENSOR_SYM && A->Type != TENSOR) | |||
Message::Error("Wrong type of argument for function 'Transpose'"); | Message::Error("Wrong type of argument for function 'Transpose'"); | |||
Cal_TransposeValue(A,V); | Cal_TransposeValue(A, V); | |||
} | } | |||
void F_Inv(F_ARG) | void F_Inv(F_ARG) | |||
{ | { | |||
if(A->Type != TENSOR_DIAG && A->Type != TENSOR_SYM && A->Type != TENSOR) | if(A->Type != TENSOR_DIAG && A->Type != TENSOR_SYM && A->Type != TENSOR) | |||
Message::Error("Wrong type of argument for function 'Inverse'"); | Message::Error("Wrong type of argument for function 'Inverse'"); | |||
Cal_InvertValue(A,V); | Cal_InvertValue(A, V); | |||
} | } | |||
void F_Det(F_ARG) | void F_Det(F_ARG) | |||
{ | { | |||
if(A->Type != TENSOR_DIAG && A->Type != TENSOR_SYM && A->Type != TENSOR) | if(A->Type != TENSOR_DIAG && A->Type != TENSOR_SYM && A->Type != TENSOR) | |||
Message::Error("Wrong type of argument for function 'Det'"); | Message::Error("Wrong type of argument for function 'Det'"); | |||
Cal_DetValue(A,V); | Cal_DetValue(A, V); | |||
} | } | |||
void F_Trace(F_ARG) | void F_Trace(F_ARG) | |||
{ | { | |||
if(A->Type != TENSOR_DIAG && A->Type != TENSOR_SYM && A->Type != TENSOR) | if(A->Type != TENSOR_DIAG && A->Type != TENSOR_SYM && A->Type != TENSOR) | |||
Message::Error("Wrong type of argument for function 'Trace'"); | Message::Error("Wrong type of argument for function 'Trace'"); | |||
Cal_TraceValue(A,V); | Cal_TraceValue(A, V); | |||
} | } | |||
void F_RotateXYZ(F_ARG) | void F_RotateXYZ(F_ARG) | |||
{ | { | |||
// Apply a (X_1 Y_2 Z_3) rotation matrix using Euler (Tait-Bryan) angles | // Apply a (X_1 Y_2 Z_3) rotation matrix using Euler (Tait-Bryan) angles | |||
double ca, sa, cb, sb, cc, sc ; | double ca, sa, cb, sb, cc, sc; | |||
struct Value Rot ; | struct Value Rot; | |||
if((A->Type != TENSOR_DIAG && A->Type != TENSOR_SYM && A->Type != TENSOR && | if((A->Type != TENSOR_DIAG && A->Type != TENSOR_SYM && A->Type != TENSOR && | |||
A->Type != VECTOR) || | A->Type != VECTOR) || | |||
(A+1)->Type != SCALAR || (A+2)->Type != SCALAR || (A+3)->Type != SCALAR) | (A + 1)->Type != SCALAR || (A + 2)->Type != SCALAR || | |||
(A + 3)->Type != SCALAR) | ||||
Message::Error("Wrong type of argument(s) for function 'Rotate'"); | Message::Error("Wrong type of argument(s) for function 'Rotate'"); | |||
ca = cos((A+1)->Val[0]) ; sa = sin((A+1)->Val[0]) ; | ca = cos((A + 1)->Val[0]); | |||
cb = cos((A+2)->Val[0]) ; sb = sin((A+2)->Val[0]) ; | sa = sin((A + 1)->Val[0]); | |||
cc = cos((A+3)->Val[0]) ; sc = sin((A+3)->Val[0]) ; | cb = cos((A + 2)->Val[0]); | |||
sb = sin((A + 2)->Val[0]); | ||||
cc = cos((A + 3)->Val[0]); | ||||
sc = sin((A + 3)->Val[0]); | ||||
Rot.Type = TENSOR ; | Rot.Type = TENSOR; | |||
Cal_ZeroValue(&Rot); | Cal_ZeroValue(&Rot); | |||
Rot.Val[0] = cb*cc; Rot.Val[1] = -cb*sc; Rot.Val[2] = sb; | Rot.Val[0] = cb * cc; | |||
Rot.Val[3] = sa*sb*cc+ca*sc; Rot.Val[4] = -sa*sb*sc+ca*cc; Rot.Val[5] = -sa*c | Rot.Val[1] = -cb * sc; | |||
b; | Rot.Val[2] = sb; | |||
Rot.Val[6] = -ca*sb*cc+sa*sc; Rot.Val[7] = ca*sb*sc+sa*cc; Rot.Val[8] = ca*c | Rot.Val[3] = sa * sb * cc + ca * sc; | |||
b; | Rot.Val[4] = -sa * sb * sc + ca * cc; | |||
Rot.Val[5] = -sa * cb; | ||||
Rot.Val[6] = -ca * sb * cc + sa * sc; | ||||
Rot.Val[7] = ca * sb * sc + sa * cc; | ||||
Rot.Val[8] = ca * cb; | ||||
Cal_RotateValue(&Rot,A,V); | Cal_RotateValue(&Rot, A, V); | |||
} | } | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
/* Norm */ | /* Norm */ | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
void F_Norm(F_ARG) | void F_Norm(F_ARG) | |||
{ | { | |||
int k ; | int k; | |||
switch(A->Type) { | switch(A->Type) { | |||
case SCALAR: | ||||
case SCALAR : | if(Current.NbrHar == 1) { V->Val[0] = fabs(A->Val[0]); } | |||
if (Current.NbrHar == 1) { | ||||
V->Val[0] = fabs(A->Val[0]) ; | ||||
} | ||||
else { | else { | |||
for (k = 0 ; k < Current.NbrHar ; k += 2 ) { | for(k = 0; k < Current.NbrHar; k += 2) { | |||
V->Val[MAX_DIM*k] = sqrt(SQU(A->Val[MAX_DIM*k]) + | V->Val[MAX_DIM * k] = | |||
SQU(A->Val[MAX_DIM*(k+1)])); | sqrt(SQU(A->Val[MAX_DIM * k]) + SQU(A->Val[MAX_DIM * (k + 1)])); | |||
V->Val[MAX_DIM*(k+1)] = 0. ; | V->Val[MAX_DIM * (k + 1)] = 0.; | |||
} | } | |||
} | } | |||
break ; | break; | |||
case VECTOR : | case VECTOR: | |||
if (Current.NbrHar == 1) { | if(Current.NbrHar == 1) { | |||
V->Val[0] = sqrt(SQU(A->Val[0]) + SQU(A->Val[1]) + SQU(A->Val[2])) ; | V->Val[0] = sqrt(SQU(A->Val[0]) + SQU(A->Val[1]) + SQU(A->Val[2])); | |||
} | } | |||
else { | else { | |||
for (k = 0 ; k < Current.NbrHar ; k += 2 ) { | for(k = 0; k < Current.NbrHar; k += 2) { | |||
V->Val[MAX_DIM*k] = sqrt(SQU(A->Val[MAX_DIM* k ]) + | V->Val[MAX_DIM * k] = | |||
SQU(A->Val[MAX_DIM* k +1]) + | sqrt(SQU(A->Val[MAX_DIM * k]) + SQU(A->Val[MAX_DIM * k + 1]) + | |||
SQU(A->Val[MAX_DIM* k +2]) + | SQU(A->Val[MAX_DIM * k + 2]) + SQU(A->Val[MAX_DIM * (k + 1)]) + | |||
SQU(A->Val[MAX_DIM*(k+1) ]) + | SQU(A->Val[MAX_DIM * (k + 1) + 1]) + | |||
SQU(A->Val[MAX_DIM*(k+1)+1]) + | SQU(A->Val[MAX_DIM * (k + 1) + 2])); | |||
SQU(A->Val[MAX_DIM*(k+1)+2])) ; | V->Val[MAX_DIM * (k + 1)] = 0.; | |||
V->Val[MAX_DIM*(k+1)] = 0. ; | ||||
} | } | |||
} | } | |||
break ; | ||||
default : | ||||
Message::Error("Wrong type of argument for function 'Norm'"); | ||||
break; | break; | |||
default: Message::Error("Wrong type of argument for function 'Norm'"); break; | ||||
} | } | |||
V->Type = SCALAR ; | V->Type = SCALAR; | |||
} | } | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
/* Square Norm */ | /* Square Norm */ | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
void F_SquNorm(F_ARG) | void F_SquNorm(F_ARG) | |||
{ | { | |||
int k ; | int k; | |||
switch(A->Type) { | switch(A->Type) { | |||
case SCALAR: | ||||
case SCALAR : | if(Current.NbrHar == 1) { V->Val[0] = SQU(A->Val[0]); } | |||
if (Current.NbrHar == 1) { | ||||
V->Val[0] = SQU(A->Val[0]) ; | ||||
} | ||||
else { | else { | |||
for (k = 0 ; k < Current.NbrHar ; k += 2 ) { | for(k = 0; k < Current.NbrHar; k += 2) { | |||
V->Val[MAX_DIM*k] = SQU(A->Val[MAX_DIM*k]) + SQU(A->Val[MAX_DIM*(k+1)]); | V->Val[MAX_DIM * k] = | |||
V->Val[MAX_DIM*(k+1)] = 0. ; | SQU(A->Val[MAX_DIM * k]) + SQU(A->Val[MAX_DIM * (k + 1)]); | |||
V->Val[MAX_DIM * (k + 1)] = 0.; | ||||
} | } | |||
} | } | |||
break ; | break; | |||
case VECTOR : | case VECTOR: | |||
if (Current.NbrHar == 1) { | if(Current.NbrHar == 1) { | |||
V->Val[0] = SQU(A->Val[0]) + SQU(A->Val[1]) + SQU(A->Val[2]) ; | V->Val[0] = SQU(A->Val[0]) + SQU(A->Val[1]) + SQU(A->Val[2]); | |||
} | } | |||
else { | else { | |||
for (k = 0 ; k < Current.NbrHar ; k += 2 ) { | for(k = 0; k < Current.NbrHar; k += 2) { | |||
V->Val[MAX_DIM*k] = SQU(A->Val[MAX_DIM* k ]) + | V->Val[MAX_DIM * k] = | |||
SQU(A->Val[MAX_DIM* k +1]) + | SQU(A->Val[MAX_DIM * k]) + SQU(A->Val[MAX_DIM * k + 1]) + | |||
SQU(A->Val[MAX_DIM* k +2]) + | SQU(A->Val[MAX_DIM * k + 2]) + SQU(A->Val[MAX_DIM * (k + 1)]) + | |||
SQU(A->Val[MAX_DIM*(k+1) ]) + | SQU(A->Val[MAX_DIM * (k + 1) + 1]) + | |||
SQU(A->Val[MAX_DIM*(k+1)+1]) + | SQU(A->Val[MAX_DIM * (k + 1) + 2]); | |||
SQU(A->Val[MAX_DIM*(k+1)+2]) ; | V->Val[MAX_DIM * (k + 1)] = 0.; | |||
V->Val[MAX_DIM*(k+1)] = 0. ; | ||||
} | } | |||
} | } | |||
break ; | break; | |||
default : | default: | |||
Message::Error("Wrong type of argument for function 'SquNorm'"); | Message::Error("Wrong type of argument for function 'SquNorm'"); | |||
break; | break; | |||
} | } | |||
V->Type = SCALAR ; | V->Type = SCALAR; | |||
} | } | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
/* Unit */ | /* Unit */ | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
void F_Unit(F_ARG) | void F_Unit(F_ARG) | |||
{ | { | |||
int k ; | int k; | |||
double Norm ; | double Norm; | |||
switch(A->Type) { | switch(A->Type) { | |||
case SCALAR: | ||||
case SCALAR : | if(Current.NbrHar == 1) { V->Val[0] = 1.; } | |||
if (Current.NbrHar == 1) { | ||||
V->Val[0] = 1. ; | ||||
} | ||||
else { | else { | |||
for (k = 0 ; k < Current.NbrHar ; k += 2 ) { | for(k = 0; k < Current.NbrHar; k += 2) { | |||
V->Val[MAX_DIM* k ] = 1. ; | V->Val[MAX_DIM * k] = 1.; | |||
V->Val[MAX_DIM*(k+1)] = 0. ; | V->Val[MAX_DIM * (k + 1)] = 0.; | |||
} | } | |||
} | } | |||
V->Type = SCALAR ; | V->Type = SCALAR; | |||
break ; | break; | |||
case VECTOR : | case VECTOR: | |||
if (Current.NbrHar == 1) { | if(Current.NbrHar == 1) { | |||
Norm = sqrt(SQU(A->Val[0]) + SQU(A->Val[1]) + SQU(A->Val[2])) ; | Norm = sqrt(SQU(A->Val[0]) + SQU(A->Val[1]) + SQU(A->Val[2])); | |||
if (Norm > 1.e-30) { /* Attention: tolerance */ | if(Norm > 1.e-30) { /* Attention: tolerance */ | |||
V->Val[0] = A->Val[0]/Norm ; | V->Val[0] = A->Val[0] / Norm; | |||
V->Val[1] = A->Val[1]/Norm ; | V->Val[1] = A->Val[1] / Norm; | |||
V->Val[2] = A->Val[2]/Norm ; | V->Val[2] = A->Val[2] / Norm; | |||
} | } | |||
else { | else { | |||
V->Val[0] = 0. ; | V->Val[0] = 0.; | |||
V->Val[1] = 0. ; | V->Val[1] = 0.; | |||
V->Val[2] = 0. ; | V->Val[2] = 0.; | |||
} | } | |||
} | } | |||
else { | else { | |||
for (k = 0 ; k < Current.NbrHar ; k += 2 ) { | for(k = 0; k < Current.NbrHar; k += 2) { | |||
Norm = sqrt(SQU(A->Val[MAX_DIM* k ]) + | Norm = | |||
SQU(A->Val[MAX_DIM* k +1]) + | sqrt(SQU(A->Val[MAX_DIM * k]) + SQU(A->Val[MAX_DIM * k + 1]) + | |||
SQU(A->Val[MAX_DIM* k +2]) + | SQU(A->Val[MAX_DIM * k + 2]) + SQU(A->Val[MAX_DIM * (k + 1)]) + | |||
SQU(A->Val[MAX_DIM*(k+1) ]) + | SQU(A->Val[MAX_DIM * (k + 1) + 1]) + | |||
SQU(A->Val[MAX_DIM*(k+1)+1]) + | SQU(A->Val[MAX_DIM * (k + 1) + 2])); | |||
SQU(A->Val[MAX_DIM*(k+1)+2])) ; | if(Norm > 1.e-30) { /* Attention: tolerance */ | |||
if (Norm > 1.e-30) { /* Attention: tolerance */ | V->Val[MAX_DIM * k] = A->Val[MAX_DIM * k] / Norm; | |||
V->Val[MAX_DIM* k ] = A->Val[MAX_DIM* k ]/Norm ; | V->Val[MAX_DIM * k + 1] = A->Val[MAX_DIM * k + 1] / Norm; | |||
V->Val[MAX_DIM* k +1] = A->Val[MAX_DIM* k +1]/Norm ; | V->Val[MAX_DIM * k + 2] = A->Val[MAX_DIM * k + 2] / Norm; | |||
V->Val[MAX_DIM* k +2] = A->Val[MAX_DIM* k +2]/Norm ; | V->Val[MAX_DIM * (k + 1)] = A->Val[MAX_DIM * (k + 1)] / Norm; | |||
V->Val[MAX_DIM*(k+1) ] = A->Val[MAX_DIM*(k+1) ]/Norm ; | V->Val[MAX_DIM * (k + 1) + 1] = A->Val[MAX_DIM * (k + 1) + 1] / Norm; | |||
V->Val[MAX_DIM*(k+1)+1] = A->Val[MAX_DIM*(k+1)+1]/Norm ; | V->Val[MAX_DIM * (k + 1) + 2] = A->Val[MAX_DIM * (k + 1) + 2] / Norm; | |||
V->Val[MAX_DIM*(k+1)+2] = A->Val[MAX_DIM*(k+1)+2]/Norm ; | } | |||
} | else { | |||
else { | V->Val[MAX_DIM * k] = 0; | |||
V->Val[MAX_DIM* k ] = 0 ; | V->Val[MAX_DIM * k + 1] = 0; | |||
V->Val[MAX_DIM* k +1] = 0 ; | V->Val[MAX_DIM * k + 2] = 0; | |||
V->Val[MAX_DIM* k +2] = 0 ; | V->Val[MAX_DIM * (k + 1)] = 0; | |||
V->Val[MAX_DIM*(k+1) ] = 0 ; | V->Val[MAX_DIM * (k + 1) + 1] = 0; | |||
V->Val[MAX_DIM*(k+1)+1] = 0 ; | V->Val[MAX_DIM * (k + 1) + 2] = 0; | |||
V->Val[MAX_DIM*(k+1)+2] = 0 ; | } | |||
} | ||||
} | } | |||
} | } | |||
V->Type = VECTOR ; | V->Type = VECTOR; | |||
break ; | ||||
default : | ||||
Message::Error("Wrong type of argument for function 'Unit'"); | ||||
break; | break; | |||
default: Message::Error("Wrong type of argument for function 'Unit'"); break; | ||||
} | } | |||
} | } | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
/* ScalarUnit */ | /* ScalarUnit */ | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
void F_ScalarUnit(F_ARG) | void F_ScalarUnit(F_ARG) | |||
{ | { | |||
int k ; | int k; | |||
if (Current.NbrHar == 1) { | if(Current.NbrHar == 1) { V->Val[0] = 1.; } | |||
V->Val[0] = 1. ; | ||||
} | ||||
else { | else { | |||
for (k = 0 ; k < Current.NbrHar ; k += 2 ) { | for(k = 0; k < Current.NbrHar; k += 2) { | |||
V->Val[MAX_DIM* k ] = 1. ; | V->Val[MAX_DIM * k] = 1.; | |||
V->Val[MAX_DIM*(k+1)] = 0. ; | V->Val[MAX_DIM * (k + 1)] = 0.; | |||
} | } | |||
} | } | |||
V->Type = SCALAR ; | V->Type = SCALAR; | |||
} | } | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
/* Time Functions */ | /* Time Functions */ | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
/* Interesting only because it allows the same formal expression in both | /* Interesting only because it allows the same formal expression in both | |||
Time and Frequency domains ! */ | Time and Frequency domains ! */ | |||
/* cos ( w * $Time + phi ) */ | /* cos ( w * $Time + phi ) */ | |||
void F_Cos_wt_p (F_ARG) | void F_Cos_wt_p(F_ARG) | |||
{ | { | |||
if (Current.NbrHar == 1) | if(Current.NbrHar == 1) | |||
V->Val[0] = cos(Fct->Para[0] * Current.Time + Fct->Para[1]) ; | V->Val[0] = cos(Fct->Para[0] * Current.Time + Fct->Para[1]); | |||
else if (Current.NbrHar == 2) { | else if(Current.NbrHar == 2) { | |||
V->Val[0] = cos(Fct->Para[1]) ; | V->Val[0] = cos(Fct->Para[1]); | |||
V->Val[MAX_DIM] = sin(Fct->Para[1]) ; | V->Val[MAX_DIM] = sin(Fct->Para[1]); | |||
} | } | |||
else { | else { | |||
Message::Error("Too many harmonics for function 'Cos_wt_p'") ; | Message::Error("Too many harmonics for function 'Cos_wt_p'"); | |||
} | } | |||
V->Type = SCALAR ; | V->Type = SCALAR; | |||
} | } | |||
/* sin ( w * $Time + phi ) */ | /* sin ( w * $Time + phi ) */ | |||
void F_Sin_wt_p (F_ARG) | void F_Sin_wt_p(F_ARG) | |||
{ | { | |||
if (Current.NbrHar == 1) | if(Current.NbrHar == 1) | |||
V->Val[0] = sin(Fct->Para[0] * Current.Time + Fct->Para[1]) ; | V->Val[0] = sin(Fct->Para[0] * Current.Time + Fct->Para[1]); | |||
else if (Current.NbrHar == 2){ | else if(Current.NbrHar == 2) { | |||
V->Val[0] = sin(Fct->Para[1]) ; | V->Val[0] = sin(Fct->Para[1]); | |||
V->Val[MAX_DIM] = -cos(Fct->Para[1]) ; | V->Val[MAX_DIM] = -cos(Fct->Para[1]); | |||
} | } | |||
else { | else { | |||
Message::Error("Too many harmonics for function 'Sin_wt_p'") ; | Message::Error("Too many harmonics for function 'Sin_wt_p'"); | |||
} | } | |||
V->Type = SCALAR ; | V->Type = SCALAR; | |||
} | } | |||
void F_Complex_MH(F_ARG) | void F_Complex_MH(F_ARG) | |||
{ | { | |||
int NbrFreq, NbrComp, i, j, k, l ; | int NbrFreq, NbrComp, i, j, k, l; | |||
struct Value R; | struct Value R; | |||
double * Val_Pulsation ; | double *Val_Pulsation; | |||
NbrFreq = Fct->NbrParameters ; | NbrFreq = Fct->NbrParameters; | |||
NbrComp = Fct->NbrArguments ; | NbrComp = Fct->NbrArguments; | |||
if (NbrComp != 2*NbrFreq) | if(NbrComp != 2 * NbrFreq) | |||
Message::Error("Number of components does not equal twice the number " | Message::Error("Number of components does not equal twice the number " | |||
"of frequencies in Complex_MH") ; | "of frequencies in Complex_MH"); | |||
R.Type = A->Type ; | R.Type = A->Type; | |||
Cal_ZeroValue(&R); | Cal_ZeroValue(&R); | |||
if (Current.NbrHar != 1) { | if(Current.NbrHar != 1) { | |||
Val_Pulsation = Current.DofData->Val_Pulsation ; | Val_Pulsation = Current.DofData->Val_Pulsation; | |||
for (i=0 ; i<NbrFreq ; i++) { | for(i = 0; i < NbrFreq; i++) { | |||
for (j = 0 ; j < Current.NbrHar/2 ; j++) | for(j = 0; j < Current.NbrHar / 2; j++) | |||
if (fabs (Val_Pulsation[j]-TWO_PI*Fct->Para[i]) <= 1e-10 * Val_Pulsation[ | if(fabs(Val_Pulsation[j] - TWO_PI * Fct->Para[i]) <= | |||
j]) { | 1e-10 * Val_Pulsation[j]) { | |||
for (k=2*j,l=2*i ; k<2*j+2 ; k++,l++) { | for(k = 2 * j, l = 2 * i; k < 2 * j + 2; k++, l++) { | |||
switch(A->Type){ | switch(A->Type) { | |||
case SCALAR : | case SCALAR: R.Val[MAX_DIM * k] += (A + l)->Val[0]; break; | |||
R.Val[MAX_DIM*k ] += (A+l)->Val[0] ; | case VECTOR: | |||
break; | case TENSOR_DIAG: | |||
case VECTOR : | R.Val[MAX_DIM * k] += (A + l)->Val[0]; | |||
case TENSOR_DIAG : | R.Val[MAX_DIM * k + 1] += (A + l)->Val[1]; | |||
R.Val[MAX_DIM*k ] += (A+l)->Val[0] ; | R.Val[MAX_DIM * k + 2] += (A + l)->Val[2]; | |||
R.Val[MAX_DIM*k+1] += (A+l)->Val[1] ; | break; | |||
R.Val[MAX_DIM*k+2] += (A+l)->Val[2] ; | case TENSOR_SYM: | |||
break; | R.Val[MAX_DIM * k] += (A + l)->Val[0]; | |||
case TENSOR_SYM : | R.Val[MAX_DIM * k + 1] += (A + l)->Val[1]; | |||
R.Val[MAX_DIM*k ] += (A+l)->Val[0] ; | R.Val[MAX_DIM * k + 2] += (A + l)->Val[2]; | |||
R.Val[MAX_DIM*k+1] += (A+l)->Val[1] ; | R.Val[MAX_DIM * k + 3] += (A + l)->Val[3]; | |||
R.Val[MAX_DIM*k+2] += (A+l)->Val[2] ; | R.Val[MAX_DIM * k + 4] += (A + l)->Val[4]; | |||
R.Val[MAX_DIM*k+3] += (A+l)->Val[3] ; | R.Val[MAX_DIM * k + 5] += (A + l)->Val[5]; | |||
R.Val[MAX_DIM*k+4] += (A+l)->Val[4] ; | break; | |||
R.Val[MAX_DIM*k+5] += (A+l)->Val[5] ; | case TENSOR: | |||
break; | R.Val[MAX_DIM * k] += (A + l)->Val[0]; | |||
case TENSOR : | R.Val[MAX_DIM * k + 1] += (A + l)->Val[1]; | |||
R.Val[MAX_DIM*k ] += (A+l)->Val[0] ; | R.Val[MAX_DIM * k + 2] += (A + l)->Val[2]; | |||
R.Val[MAX_DIM*k+1] += (A+l)->Val[1] ; | R.Val[MAX_DIM * k + 3] += (A + l)->Val[3]; | |||
R.Val[MAX_DIM*k+2] += (A+l)->Val[2] ; | R.Val[MAX_DIM * k + 4] += (A + l)->Val[4]; | |||
R.Val[MAX_DIM*k+3] += (A+l)->Val[3] ; | R.Val[MAX_DIM * k + 5] += (A + l)->Val[5]; | |||
R.Val[MAX_DIM*k+4] += (A+l)->Val[4] ; | R.Val[MAX_DIM * k + 6] += (A + l)->Val[6]; | |||
R.Val[MAX_DIM*k+5] += (A+l)->Val[5] ; | R.Val[MAX_DIM * k + 7] += (A + l)->Val[7]; | |||
R.Val[MAX_DIM*k+6] += (A+l)->Val[6] ; | R.Val[MAX_DIM * k + 8] += (A + l)->Val[8]; | |||
R.Val[MAX_DIM*k+7] += (A+l)->Val[7] ; | break; | |||
R.Val[MAX_DIM*k+8] += (A+l)->Val[8] ; | default: | |||
break; | Message::Error( | |||
default : | "Unknown type of arguments in function 'Complex_MH'"); | |||
Message::Error("Unknown type of arguments in function 'Complex_MH'" | break; | |||
); | } | |||
break; | } | |||
} | } | |||
} | } | |||
} | } | |||
} | else { /* time domain */ | |||
} else { /* time domain */ | for(i = 0; i < NbrFreq; i++) { | |||
for (i=0 ; i<NbrFreq ; i++) { | Cal_AddMultValue(&R, A + 2 * i, cos(TWO_PI * Fct->Para[i] * Current.Time), | |||
Cal_AddMultValue (&R, A+2*i, cos(TWO_PI*Fct->Para[i]*Current.Time), &R) | &R); | |||
; | Cal_AddMultValue(&R, A + 2 * i + 1, | |||
Cal_AddMultValue (&R, A+2*i+1, -sin(TWO_PI*Fct->Para[i]*Current.Time), &R) | -sin(TWO_PI * Fct->Para[i] * Current.Time), &R); | |||
; | ||||
} | } | |||
} | } | |||
Cal_CopyValue(&R,V); | Cal_CopyValue(&R, V); | |||
} | } | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
/* Period */ | /* Period */ | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
void F_Period (F_ARG) | void F_Period(F_ARG) | |||
{ | { | |||
if (Current.NbrHar == 1) | if(Current.NbrHar == 1) | |||
V->Val[0] = fmod(A->Val[0], Fct->Para[0]) | V->Val[0] = | |||
+ ((A->Val[0] < 0.)? Fct->Para[0] : 0.) ; | fmod(A->Val[0], Fct->Para[0]) + ((A->Val[0] < 0.) ? Fct->Para[0] : 0.); | |||
else | else | |||
Message::Error("Function 'F_Period' not valid for Complex"); | Message::Error("Function 'F_Period' not valid for Complex"); | |||
V->Type = SCALAR ; | V->Type = SCALAR; | |||
} | } | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
/* Interval */ | /* Interval */ | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
void F_Interval (F_ARG) | void F_Interval(F_ARG) | |||
{ | { | |||
int k; | int k; | |||
double tmp; | double tmp; | |||
if (Current.NbrHar == 1) { | if(Current.NbrHar == 1) { | |||
V->Val[0] = | V->Val[0] = A->Val[0] > (A + 1)->Val[0] + Fct->Para[0] * Fct->Para[2] && | |||
A->Val[0] > (A+1)->Val[0] + Fct->Para[0] * Fct->Para[2] && | A->Val[0] < (A + 2)->Val[0] + Fct->Para[1] * Fct->Para[2]; | |||
A->Val[0] < (A+2)->Val[0] + Fct->Para[1] * Fct->Para[2] ; | ||||
} | } | |||
else { | else { | |||
tmp = | tmp = A->Val[0] > (A + 1)->Val[0] + Fct->Para[0] * Fct->Para[2] && | |||
A->Val[0] > (A+1)->Val[0] + Fct->Para[0] * Fct->Para[2] && | A->Val[0] < (A + 2)->Val[0] + Fct->Para[1] * Fct->Para[2]; | |||
A->Val[0] < (A+2)->Val[0] + Fct->Para[1] * Fct->Para[2] ; | ||||
for (k = 0 ; k < Current.NbrHar ; k += 2) { | for(k = 0; k < Current.NbrHar; k += 2) { | |||
V->Val[MAX_DIM* k ] = tmp ; | V->Val[MAX_DIM * k] = tmp; | |||
V->Val[MAX_DIM*(k+1)] = 0. ; | V->Val[MAX_DIM * (k + 1)] = 0.; | |||
} | } | |||
} | } | |||
V->Type = SCALAR ; | V->Type = SCALAR; | |||
} | } | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
/* Create a Complex Value from k Real Values (of same type!) */ | /* Create a Complex Value from k Real Values (of same type!) */ | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
void F_Complex(F_ARG) | void F_Complex(F_ARG) | |||
{ | { | |||
int NbrPar = Fct->NbrParameters ; | int NbrPar = Fct->NbrParameters; | |||
int NbrArg = Fct->NbrArguments ; | int NbrArg = Fct->NbrArguments; | |||
if(NbrArg){ | if(NbrArg) { | |||
if(NbrArg > NBR_MAX_HARMONIC){ | if(NbrArg > NBR_MAX_HARMONIC) { | |||
Message::Error("Too many arguments for Complex[expression-list]{}"); | Message::Error("Too many arguments for Complex[expression-list]{}"); | |||
return; | return; | |||
} | } | |||
} | } | |||
else if(NbrPar){ | else if(NbrPar) { | |||
if(NbrPar > NBR_MAX_HARMONIC){ | if(NbrPar > NBR_MAX_HARMONIC) { | |||
Message::Error("Too many parameters for Complex[]{expression-cst-list}"); | Message::Error("Too many parameters for Complex[]{expression-cst-list}"); | |||
return; | return; | |||
} | } | |||
} | } | |||
else{ | else { | |||
Message::Error("Missing arguments or parameters for Complex[expression-list] | Message::Error("Missing arguments or parameters for " | |||
{expression-cst-list}"); | "Complex[expression-list]{expression-cst-list}"); | |||
return; | return; | |||
} | } | |||
int k ; | int k; | |||
if(NbrPar){ | if(NbrPar) { | |||
for (k = 0 ; k < Current.NbrHar ; k++) | for(k = 0; k < Current.NbrHar; k++) V->Val[MAX_DIM * k] = Fct->Para[k]; | |||
V->Val[MAX_DIM*k] = Fct->Para[k] ; | for(k = Current.NbrHar; k < NbrPar; k++) V->Val[MAX_DIM * k] = 0.; | |||
for (k = Current.NbrHar ; k < NbrPar ; k++) | ||||
V->Val[MAX_DIM*k] = 0. ; | ||||
V->Type = SCALAR; | V->Type = SCALAR; | |||
return; | return; | |||
} | } | |||
switch(A->Type){ | switch(A->Type) { | |||
case SCALAR: | ||||
case SCALAR : | for(k = 0; k < Current.NbrHar; k++) { | |||
for (k = 0 ; k < Current.NbrHar ; k++) { | if((A + k)->Type != A->Type) | |||
if((A+k)->Type != A->Type) | Message::Error("Mixed type of arguments in function 'Complex'"); | |||
Message::Error("Mixed type of arguments in function 'Complex'"); | V->Val[MAX_DIM * k] = (A + k)->Val[0]; | |||
V->Val[MAX_DIM*k] = (A+k)->Val[0] ; | } | |||
} | for(k = Current.NbrHar; k < NbrArg; k++) { V->Val[MAX_DIM * k] = 0.; } | |||
for (k = Current.NbrHar ; k < NbrArg ; k++) { | break; | |||
V->Val[MAX_DIM*k] = 0. ; | ||||
} | case VECTOR: | |||
break; | case TENSOR_DIAG: | |||
for(k = 0; k < Current.NbrHar; k++) { | ||||
case VECTOR : | if((A + k)->Type != A->Type) | |||
case TENSOR_DIAG : | Message::Error("Mixed type of arguments in function 'Complex'"); | |||
for (k = 0 ; k < Current.NbrHar ; k++) { | V->Val[MAX_DIM * k] = (A + k)->Val[0]; | |||
if((A+k)->Type != A->Type) | V->Val[MAX_DIM * k + 1] = (A + k)->Val[1]; | |||
Message::Error("Mixed type of arguments in function 'Complex'"); | V->Val[MAX_DIM * k + 2] = (A + k)->Val[2]; | |||
V->Val[MAX_DIM*k ] = (A+k)->Val[0] ; | } | |||
V->Val[MAX_DIM*k+1] = (A+k)->Val[1] ; | for(k = Current.NbrHar; k < NbrArg; k++) { | |||
V->Val[MAX_DIM*k+2] = (A+k)->Val[2] ; | V->Val[MAX_DIM * k] = 0.; | |||
} | V->Val[MAX_DIM * k + 1] = 0.; | |||
for (k = Current.NbrHar ; k < NbrArg ; k++) { | V->Val[MAX_DIM * k + 2] = 0.; | |||
V->Val[MAX_DIM*k ] = 0. ; | } | |||
V->Val[MAX_DIM*k+1] = 0. ; | break; | |||
V->Val[MAX_DIM*k+2] = 0. ; | ||||
} | case TENSOR_SYM: | |||
break; | for(k = 0; k < Current.NbrHar; k++) { | |||
if((A + k)->Type != A->Type) | ||||
case TENSOR_SYM : | Message::Error("Mixed type of arguments in function 'Complex'"); | |||
for (k = 0 ; k < Current.NbrHar ; k++) { | V->Val[MAX_DIM * k] = (A + k)->Val[0]; | |||
if((A+k)->Type != A->Type) | V->Val[MAX_DIM * k + 1] = (A + k)->Val[1]; | |||
Message::Error("Mixed type of arguments in function 'Complex'"); | V->Val[MAX_DIM * k + 2] = (A + k)->Val[2]; | |||
V->Val[MAX_DIM*k ] = (A+k)->Val[0] ; | V->Val[MAX_DIM * k + 3] = (A + k)->Val[3]; | |||
V->Val[MAX_DIM*k+1] = (A+k)->Val[1] ; | V->Val[MAX_DIM * k + 4] = (A + k)->Val[4]; | |||
V->Val[MAX_DIM*k+2] = (A+k)->Val[2] ; | V->Val[MAX_DIM * k + 5] = (A + k)->Val[5]; | |||
V->Val[MAX_DIM*k+3] = (A+k)->Val[3] ; | } | |||
V->Val[MAX_DIM*k+4] = (A+k)->Val[4] ; | for(k = Current.NbrHar; k < NbrArg; k++) { | |||
V->Val[MAX_DIM*k+5] = (A+k)->Val[5] ; | V->Val[MAX_DIM * k] = 0.; | |||
} | V->Val[MAX_DIM * k + 1] = 0.; | |||
for (k = Current.NbrHar ; k < NbrArg ; k++) { | V->Val[MAX_DIM * k + 2] = 0.; | |||
V->Val[MAX_DIM*k ] = 0. ; | V->Val[MAX_DIM * k + 3] = 0.; | |||
V->Val[MAX_DIM*k+1] = 0. ; | V->Val[MAX_DIM * k + 4] = 0.; | |||
V->Val[MAX_DIM*k+2] = 0. ; | V->Val[MAX_DIM * k + 5] = 0.; | |||
V->Val[MAX_DIM*k+3] = 0. ; | } | |||
V->Val[MAX_DIM*k+4] = 0. ; | break; | |||
V->Val[MAX_DIM*k+5] = 0. ; | ||||
} | case TENSOR: | |||
break; | for(k = 0; k < Current.NbrHar; k++) { | |||
if((A + k)->Type != A->Type) | ||||
case TENSOR : | Message::Error("Mixed type of arguments in function 'Complex'"); | |||
for (k = 0 ; k < Current.NbrHar ; k++) { | V->Val[MAX_DIM * k] = (A + k)->Val[0]; | |||
if((A+k)->Type != A->Type) | V->Val[MAX_DIM * k + 1] = (A + k)->Val[1]; | |||
Message::Error("Mixed type of arguments in function 'Complex'"); | V->Val[MAX_DIM * k + 2] = (A + k)->Val[2]; | |||
V->Val[MAX_DIM*k ] = (A+k)->Val[0] ; | V->Val[MAX_DIM * k + 3] = (A + k)->Val[3]; | |||
V->Val[MAX_DIM*k+1] = (A+k)->Val[1] ; | V->Val[MAX_DIM * k + 4] = (A + k)->Val[4]; | |||
V->Val[MAX_DIM*k+2] = (A+k)->Val[2] ; | V->Val[MAX_DIM * k + 5] = (A + k)->Val[5]; | |||
V->Val[MAX_DIM*k+3] = (A+k)->Val[3] ; | V->Val[MAX_DIM * k + 6] = (A + k)->Val[6]; | |||
V->Val[MAX_DIM*k+4] = (A+k)->Val[4] ; | V->Val[MAX_DIM * k + 7] = (A + k)->Val[7]; | |||
V->Val[MAX_DIM*k+5] = (A+k)->Val[5] ; | V->Val[MAX_DIM * k + 8] = (A + k)->Val[8]; | |||
V->Val[MAX_DIM*k+6] = (A+k)->Val[6] ; | } | |||
V->Val[MAX_DIM*k+7] = (A+k)->Val[7] ; | for(k = Current.NbrHar; k < NbrArg; k++) { | |||
V->Val[MAX_DIM*k+8] = (A+k)->Val[8] ; | V->Val[MAX_DIM * k] = 0.; | |||
} | V->Val[MAX_DIM * k + 1] = 0.; | |||
for (k = Current.NbrHar ; k < NbrArg ; k++) { | V->Val[MAX_DIM * k + 2] = 0.; | |||
V->Val[MAX_DIM*k ] = 0. ; | V->Val[MAX_DIM * k + 3] = 0.; | |||
V->Val[MAX_DIM*k+1] = 0. ; | V->Val[MAX_DIM * k + 4] = 0.; | |||
V->Val[MAX_DIM*k+2] = 0. ; | V->Val[MAX_DIM * k + 5] = 0.; | |||
V->Val[MAX_DIM*k+3] = 0. ; | V->Val[MAX_DIM * k + 6] = 0.; | |||
V->Val[MAX_DIM*k+4] = 0. ; | V->Val[MAX_DIM * k + 7] = 0.; | |||
V->Val[MAX_DIM*k+5] = 0. ; | V->Val[MAX_DIM * k + 8] = 0.; | |||
V->Val[MAX_DIM*k+6] = 0. ; | ||||
V->Val[MAX_DIM*k+7] = 0. ; | ||||
V->Val[MAX_DIM*k+8] = 0. ; | ||||
} | } | |||
break; | break; | |||
default : | default: | |||
Message::Error("Unknown type of arguments in function 'Complex'"); | Message::Error("Unknown type of arguments in function 'Complex'"); | |||
break; | break; | |||
} | } | |||
V->Type = A->Type ; | V->Type = A->Type; | |||
} | } | |||
/* ----------------------------------------------------------------------- */ | /* ----------------------------------------------------------------------- */ | |||
/* Get the Real Part of a Value */ | /* Get the Real Part of a Value */ | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
void F_Re(F_ARG) | void F_Re(F_ARG) | |||
{ | { | |||
int k ; | int k; | |||
switch(A->Type) { | ||||
case SCALAR: | ||||
for(k = 0; k < Current.NbrHar; k += 2) { | ||||
V->Val[MAX_DIM * k] = A->Val[MAX_DIM * k]; | ||||
V->Val[MAX_DIM * (k + 1)] = 0.; | ||||
} | ||||
break; | ||||
switch (A->Type) { | case VECTOR: | |||
case SCALAR : | case TENSOR_DIAG: | |||
for (k = 0 ; k < Current.NbrHar ; k+=2) { | for(k = 0; k < Current.NbrHar; k += 2) { | |||
V->Val[MAX_DIM*k] = A->Val[MAX_DIM*k] ; | V->Val[MAX_DIM * k] = A->Val[MAX_DIM * k]; | |||
V->Val[MAX_DIM*(k+1)] = 0. ; | V->Val[MAX_DIM * k + 1] = A->Val[MAX_DIM * k + 1]; | |||
} | V->Val[MAX_DIM * k + 2] = A->Val[MAX_DIM * k + 2]; | |||
break; | V->Val[MAX_DIM * (k + 1)] = 0.; | |||
V->Val[MAX_DIM * (k + 1) + 1] = 0.; | ||||
case VECTOR : | V->Val[MAX_DIM * (k + 1) + 2] = 0.; | |||
case TENSOR_DIAG : | ||||
for (k = 0 ; k < Current.NbrHar ; k+=2) { | ||||
V->Val[MAX_DIM*k ] = A->Val[MAX_DIM*k ] ; | ||||
V->Val[MAX_DIM*k+1] = A->Val[MAX_DIM*k+1] ; | ||||
V->Val[MAX_DIM*k+2] = A->Val[MAX_DIM*k+2] ; | ||||
V->Val[MAX_DIM*(k+1) ] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+1] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+2] = 0. ; | ||||
} | ||||
break; | ||||
case TENSOR_SYM : | ||||
for (k = 0 ; k < Current.NbrHar ; k+=2) { | ||||
V->Val[MAX_DIM*k ] = A->Val[MAX_DIM*k ] ; | ||||
V->Val[MAX_DIM*k+1] = A->Val[MAX_DIM*k+1] ; | ||||
V->Val[MAX_DIM*k+2] = A->Val[MAX_DIM*k+2] ; | ||||
V->Val[MAX_DIM*k+3] = A->Val[MAX_DIM*k+3] ; | ||||
V->Val[MAX_DIM*k+4] = A->Val[MAX_DIM*k+4] ; | ||||
V->Val[MAX_DIM*k+5] = A->Val[MAX_DIM*k+5] ; | ||||
V->Val[MAX_DIM*(k+1) ] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+1] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+2] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+3] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+4] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+5] = 0. ; | ||||
} | ||||
break; | ||||
case TENSOR : | ||||
for (k = 0 ; k < Current.NbrHar ; k+=2) { | ||||
V->Val[MAX_DIM*k ] = A->Val[MAX_DIM*k ] ; | ||||
V->Val[MAX_DIM*k+1] = A->Val[MAX_DIM*k+1] ; | ||||
V->Val[MAX_DIM*k+2] = A->Val[MAX_DIM*k+2] ; | ||||
V->Val[MAX_DIM*k+3] = A->Val[MAX_DIM*k+3] ; | ||||
V->Val[MAX_DIM*k+4] = A->Val[MAX_DIM*k+4] ; | ||||
V->Val[MAX_DIM*k+5] = A->Val[MAX_DIM*k+5] ; | ||||
V->Val[MAX_DIM*k+6] = A->Val[MAX_DIM*k+6] ; | ||||
V->Val[MAX_DIM*k+7] = A->Val[MAX_DIM*k+7] ; | ||||
V->Val[MAX_DIM*k+8] = A->Val[MAX_DIM*k+8] ; | ||||
V->Val[MAX_DIM*(k+1) ] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+1] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+2] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+3] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+4] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+5] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+6] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+7] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+8] = 0. ; | ||||
} | } | |||
break; | break; | |||
default : | case TENSOR_SYM: | |||
Message::Error("Unknown type of arguments in function 'Re'"); | for(k = 0; k < Current.NbrHar; k += 2) { | |||
V->Val[MAX_DIM * k] = A->Val[MAX_DIM * k]; | ||||
V->Val[MAX_DIM * k + 1] = A->Val[MAX_DIM * k + 1]; | ||||
V->Val[MAX_DIM * k + 2] = A->Val[MAX_DIM * k + 2]; | ||||
V->Val[MAX_DIM * k + 3] = A->Val[MAX_DIM * k + 3]; | ||||
V->Val[MAX_DIM * k + 4] = A->Val[MAX_DIM * k + 4]; | ||||
V->Val[MAX_DIM * k + 5] = A->Val[MAX_DIM * k + 5]; | ||||
V->Val[MAX_DIM * (k + 1)] = 0.; | ||||
V->Val[MAX_DIM * (k + 1) + 1] = 0.; | ||||
V->Val[MAX_DIM * (k + 1) + 2] = 0.; | ||||
V->Val[MAX_DIM * (k + 1) + 3] = 0.; | ||||
V->Val[MAX_DIM * (k + 1) + 4] = 0.; | ||||
V->Val[MAX_DIM * (k + 1) + 5] = 0.; | ||||
} | ||||
break; | break; | |||
case TENSOR: | ||||
for(k = 0; k < Current.NbrHar; k += 2) { | ||||
V->Val[MAX_DIM * k] = A->Val[MAX_DIM * k]; | ||||
V->Val[MAX_DIM * k + 1] = A->Val[MAX_DIM * k + 1]; | ||||
V->Val[MAX_DIM * k + 2] = A->Val[MAX_DIM * k + 2]; | ||||
V->Val[MAX_DIM * k + 3] = A->Val[MAX_DIM * k + 3]; | ||||
V->Val[MAX_DIM * k + 4] = A->Val[MAX_DIM * k + 4]; | ||||
V->Val[MAX_DIM * k + 5] = A->Val[MAX_DIM * k + 5]; | ||||
V->Val[MAX_DIM * k + 6] = A->Val[MAX_DIM * k + 6]; | ||||
V->Val[MAX_DIM * k + 7] = A->Val[MAX_DIM * k + 7]; | ||||
V->Val[MAX_DIM * k + 8] = A->Val[MAX_DIM * k + 8]; | ||||
V->Val[MAX_DIM * (k + 1)] = 0.; | ||||
V->Val[MAX_DIM * (k + 1) + 1] = 0.; | ||||
V->Val[MAX_DIM * (k + 1) + 2] = 0.; | ||||
V->Val[MAX_DIM * (k + 1) + 3] = 0.; | ||||
V->Val[MAX_DIM * (k + 1) + 4] = 0.; | ||||
V->Val[MAX_DIM * (k + 1) + 5] = 0.; | ||||
V->Val[MAX_DIM * (k + 1) + 6] = 0.; | ||||
V->Val[MAX_DIM * (k + 1) + 7] = 0.; | ||||
V->Val[MAX_DIM * (k + 1) + 8] = 0.; | ||||
} | ||||
break; | ||||
default: Message::Error("Unknown type of arguments in function 'Re'"); break; | ||||
} | } | |||
V->Type = A->Type ; | V->Type = A->Type; | |||
} | } | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
/* Get the Imaginary Part of a Value */ | /* Get the Imaginary Part of a Value */ | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
void F_Im(F_ARG) | void F_Im(F_ARG) | |||
{ | { | |||
int k ; | int k; | |||
switch (A->Type) { | switch(A->Type) { | |||
case SCALAR : | case SCALAR: | |||
for (k = 0 ; k < Current.NbrHar ; k+=2) { | for(k = 0; k < Current.NbrHar; k += 2) { | |||
V->Val[MAX_DIM*k] = A->Val[MAX_DIM*(k+1)] ; | V->Val[MAX_DIM * k] = A->Val[MAX_DIM * (k + 1)]; | |||
V->Val[MAX_DIM*(k+1)] = 0. ; | V->Val[MAX_DIM * (k + 1)] = 0.; | |||
} | ||||
break; | ||||
case VECTOR : | ||||
case TENSOR_DIAG : | ||||
for (k = 0 ; k < Current.NbrHar ; k+=2) { | ||||
V->Val[MAX_DIM*k ] = A->Val[MAX_DIM*(k+1) ] ; | ||||
V->Val[MAX_DIM*k+1] = A->Val[MAX_DIM*(k+1)+1] ; | ||||
V->Val[MAX_DIM*k+2] = A->Val[MAX_DIM*(k+1)+2] ; | ||||
V->Val[MAX_DIM*(k+1) ] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+1] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+2] = 0. ; | ||||
} | ||||
break; | ||||
case TENSOR_SYM : | ||||
for (k = 0 ; k < Current.NbrHar ; k+=2) { | ||||
V->Val[MAX_DIM*k ] = A->Val[MAX_DIM*(k+1) ] ; | ||||
V->Val[MAX_DIM*k+1] = A->Val[MAX_DIM*(k+1)+1] ; | ||||
V->Val[MAX_DIM*k+2] = A->Val[MAX_DIM*(k+1)+2] ; | ||||
V->Val[MAX_DIM*k+3] = A->Val[MAX_DIM*(k+1)+3] ; | ||||
V->Val[MAX_DIM*k+4] = A->Val[MAX_DIM*(k+1)+4] ; | ||||
V->Val[MAX_DIM*k+5] = A->Val[MAX_DIM*(k+1)+5] ; | ||||
V->Val[MAX_DIM*(k+1) ] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+1] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+2] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+3] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+4] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+5] = 0. ; | ||||
} | ||||
break; | ||||
case TENSOR : | ||||
for (k = 0 ; k < Current.NbrHar ; k+=2) { | ||||
V->Val[MAX_DIM*k ] = A->Val[MAX_DIM*(k+1) ] ; | ||||
V->Val[MAX_DIM*k+1] = A->Val[MAX_DIM*(k+1)+1] ; | ||||
V->Val[MAX_DIM*k+2] = A->Val[MAX_DIM*(k+1)+2] ; | ||||
V->Val[MAX_DIM*k+3] = A->Val[MAX_DIM*(k+1)+3] ; | ||||
V->Val[MAX_DIM*k+4] = A->Val[MAX_DIM*(k+1)+4] ; | ||||
V->Val[MAX_DIM*k+5] = A->Val[MAX_DIM*(k+1)+5] ; | ||||
V->Val[MAX_DIM*k+6] = A->Val[MAX_DIM*(k+1)+6] ; | ||||
V->Val[MAX_DIM*k+7] = A->Val[MAX_DIM*(k+1)+7] ; | ||||
V->Val[MAX_DIM*k+8] = A->Val[MAX_DIM*(k+1)+8] ; | ||||
V->Val[MAX_DIM*(k+1) ] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+1] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+2] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+3] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+4] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+5] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+6] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+7] = 0. ; | ||||
V->Val[MAX_DIM*(k+1)+8] = 0. ; | ||||
} | } | |||
break; | break; | |||
default : | case VECTOR: | |||
Message::Error("Unknown type of arguments in function 'Im'"); | case TENSOR_DIAG: | |||
for(k = 0; k < Current.NbrHar; k += 2) { | ||||
V->Val[MAX_DIM * k] = A->Val[MAX_DIM * (k + 1)]; | ||||
V->Val[MAX_DIM * k + 1] = A->Val[MAX_DIM * (k + 1) + 1]; | ||||
V->Val[MAX_DIM * k + 2] = A->Val[MAX_DIM * (k + 1) + 2]; | ||||
V->Val[MAX_DIM * (k + 1)] = 0.; | ||||
V->Val[MAX_DIM * (k + 1) + 1] = 0.; | ||||
V->Val[MAX_DIM * (k + 1) + 2] = 0.; | ||||
} | ||||
break; | ||||
case TENSOR_SYM: | ||||
for(k = 0; k < Current.NbrHar; k += 2) { | ||||
V->Val[MAX_DIM * k] = A->Val[MAX_DIM * (k + 1)]; | ||||
V->Val[MAX_DIM * k + 1] = A->Val[MAX_DIM * (k + 1) + 1]; | ||||
V->Val[MAX_DIM * k + 2] = A->Val[MAX_DIM * (k + 1) + 2]; | ||||
V->Val[MAX_DIM * k + 3] = A->Val[MAX_DIM * (k + 1) + 3]; | ||||
V->Val[MAX_DIM * k + 4] = A->Val[MAX_DIM * (k + 1) + 4]; | ||||
V->Val[MAX_DIM * k + 5] = A->Val[MAX_DIM * (k + 1) + 5]; | ||||
V->Val[MAX_DIM * (k + 1)] = 0.; | ||||
V->Val[MAX_DIM * (k + 1) + 1] = 0.; | ||||
V->Val[MAX_DIM * (k + 1) + 2] = 0.; | ||||
V->Val[MAX_DIM * (k + 1) + 3] = 0.; | ||||
V->Val[MAX_DIM * (k + 1) + 4] = 0.; | ||||
V->Val[MAX_DIM * (k + 1) + 5] = 0.; | ||||
} | ||||
break; | break; | |||
case TENSOR: | ||||
for(k = 0; k < Current.NbrHar; k += 2) { | ||||
V->Val[MAX_DIM * k] = A->Val[MAX_DIM * (k + 1)]; | ||||
V->Val[MAX_DIM * k + 1] = A->Val[MAX_DIM * (k + 1) + 1]; | ||||
V->Val[MAX_DIM * k + 2] = A->Val[MAX_DIM * (k + 1) + 2]; | ||||
V->Val[MAX_DIM * k + 3] = A->Val[MAX_DIM * (k + 1) + 3]; | ||||
V->Val[MAX_DIM * k + 4] = A->Val[MAX_DIM * (k + 1) + 4]; | ||||
V->Val[MAX_DIM * k + 5] = A->Val[MAX_DIM * (k + 1) + 5]; | ||||
V->Val[MAX_DIM * k + 6] = A->Val[MAX_DIM * (k + 1) + 6]; | ||||
V->Val[MAX_DIM * k + 7] = A->Val[MAX_DIM * (k + 1) + 7]; | ||||
V->Val[MAX_DIM * k + 8] = A->Val[MAX_DIM * (k + 1) + 8]; | ||||
V->Val[MAX_DIM * (k + 1)] = 0.; | ||||
V->Val[MAX_DIM * (k + 1) + 1] = 0.; | ||||
V->Val[MAX_DIM * (k + 1) + 2] = 0.; | ||||
V->Val[MAX_DIM * (k + 1) + 3] = 0.; | ||||
V->Val[MAX_DIM * (k + 1) + 4] = 0.; | ||||
V->Val[MAX_DIM * (k + 1) + 5] = 0.; | ||||
V->Val[MAX_DIM * (k + 1) + 6] = 0.; | ||||
V->Val[MAX_DIM * (k + 1) + 7] = 0.; | ||||
V->Val[MAX_DIM * (k + 1) + 8] = 0.; | ||||
} | ||||
break; | ||||
default: Message::Error("Unknown type of arguments in function 'Im'"); break; | ||||
} | } | |||
V->Type = A->Type ; | V->Type = A->Type; | |||
} | } | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
/* Conjugate */ | /* Conjugate */ | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
void F_Conj(F_ARG) | void F_Conj(F_ARG) | |||
{ | { | |||
int k ; | int k; | |||
switch (A->Type) { | switch(A->Type) { | |||
case SCALAR : | case SCALAR: | |||
for (k = 0 ; k < Current.NbrHar ; k+=2) { | for(k = 0; k < Current.NbrHar; k += 2) { | |||
V->Val[MAX_DIM*k] = A->Val[MAX_DIM*k] ; | V->Val[MAX_DIM * k] = A->Val[MAX_DIM * k]; | |||
V->Val[MAX_DIM*(k+1)] = -A->Val[MAX_DIM*(k+1)] ; | V->Val[MAX_DIM * (k + 1)] = -A->Val[MAX_DIM * (k + 1)]; | |||
} | } | |||
break; | break; | |||
case VECTOR : | case VECTOR: | |||
case TENSOR_DIAG : | case TENSOR_DIAG: | |||
for (k = 0 ; k < Current.NbrHar ; k+=2) { | for(k = 0; k < Current.NbrHar; k += 2) { | |||
V->Val[MAX_DIM*k ] = A->Val[MAX_DIM*k ] ; | V->Val[MAX_DIM * k] = A->Val[MAX_DIM * k]; | |||
V->Val[MAX_DIM*k+1] = A->Val[MAX_DIM*k+1] ; | V->Val[MAX_DIM * k + 1] = A->Val[MAX_DIM * k + 1]; | |||
V->Val[MAX_DIM*k+2] = A->Val[MAX_DIM*k+2] ; | V->Val[MAX_DIM * k + 2] = A->Val[MAX_DIM * k + 2]; | |||
V->Val[MAX_DIM*(k+1) ] = -A->Val[MAX_DIM*(k+1) ] ; | V->Val[MAX_DIM * (k + 1)] = -A->Val[MAX_DIM * (k + 1)]; | |||
V->Val[MAX_DIM*(k+1)+1] = -A->Val[MAX_DIM*(k+1)+1] ; | V->Val[MAX_DIM * (k + 1) + 1] = -A->Val[MAX_DIM * (k + 1) + 1]; | |||
V->Val[MAX_DIM*(k+1)+2] = -A->Val[MAX_DIM*(k+1)+2] ; | V->Val[MAX_DIM * (k + 1) + 2] = -A->Val[MAX_DIM * (k + 1) + 2]; | |||
} | } | |||
break; | break; | |||
case TENSOR_SYM : | case TENSOR_SYM: | |||
for (k = 0 ; k < Current.NbrHar ; k+=2) { | for(k = 0; k < Current.NbrHar; k += 2) { | |||
V->Val[MAX_DIM*k ] = A->Val[MAX_DIM*k ] ; | V->Val[MAX_DIM * k] = A->Val[MAX_DIM * k]; | |||
V->Val[MAX_DIM*k+1] = A->Val[MAX_DIM*k+1] ; | V->Val[MAX_DIM * k + 1] = A->Val[MAX_DIM * k + 1]; | |||
V->Val[MAX_DIM*k+2] = A->Val[MAX_DIM*k+2] ; | V->Val[MAX_DIM * k + 2] = A->Val[MAX_DIM * k + 2]; | |||
V->Val[MAX_DIM*k+3] = A->Val[MAX_DIM*k+3] ; | V->Val[MAX_DIM * k + 3] = A->Val[MAX_DIM * k + 3]; | |||
V->Val[MAX_DIM*k+4] = A->Val[MAX_DIM*k+4] ; | V->Val[MAX_DIM * k + 4] = A->Val[MAX_DIM * k + 4]; | |||
V->Val[MAX_DIM*k+5] = A->Val[MAX_DIM*k+5] ; | V->Val[MAX_DIM * k + 5] = A->Val[MAX_DIM * k + 5]; | |||
V->Val[MAX_DIM*(k+1) ] = -A->Val[MAX_DIM*(k+1) ] ; | V->Val[MAX_DIM * (k + 1)] = -A->Val[MAX_DIM * (k + 1)]; | |||
V->Val[MAX_DIM*(k+1)+1] = -A->Val[MAX_DIM*(k+1)+1] ; | V->Val[MAX_DIM * (k + 1) + 1] = -A->Val[MAX_DIM * (k + 1) + 1]; | |||
V->Val[MAX_DIM*(k+1)+2] = -A->Val[MAX_DIM*(k+1)+2] ; | V->Val[MAX_DIM * (k + 1) + 2] = -A->Val[MAX_DIM * (k + 1) + 2]; | |||
V->Val[MAX_DIM*(k+1)+3] = -A->Val[MAX_DIM*(k+1)+3] ; | V->Val[MAX_DIM * (k + 1) + 3] = -A->Val[MAX_DIM * (k + 1) + 3]; | |||
V->Val[MAX_DIM*(k+1)+4] = -A->Val[MAX_DIM*(k+1)+4] ; | V->Val[MAX_DIM * (k + 1) + 4] = -A->Val[MAX_DIM * (k + 1) + 4]; | |||
V->Val[MAX_DIM*(k+1)+5] = -A->Val[MAX_DIM*(k+1)+5] ; | V->Val[MAX_DIM * (k + 1) + 5] = -A->Val[MAX_DIM * (k + 1) + 5]; | |||
} | } | |||
break; | break; | |||
case TENSOR : | case TENSOR: | |||
for (k = 0 ; k < Current.NbrHar ; k+=2) { | for(k = 0; k < Current.NbrHar; k += 2) { | |||
V->Val[MAX_DIM*k ] = A->Val[MAX_DIM*k ] ; | V->Val[MAX_DIM * k] = A->Val[MAX_DIM * k]; | |||
V->Val[MAX_DIM*k+1] = A->Val[MAX_DIM*k+1] ; | V->Val[MAX_DIM * k + 1] = A->Val[MAX_DIM * k + 1]; | |||
V->Val[MAX_DIM*k+2] = A->Val[MAX_DIM*k+2] ; | V->Val[MAX_DIM * k + 2] = A->Val[MAX_DIM * k + 2]; | |||
V->Val[MAX_DIM*k+3] = A->Val[MAX_DIM*k+3] ; | V->Val[MAX_DIM * k + 3] = A->Val[MAX_DIM * k + 3]; | |||
V->Val[MAX_DIM*k+4] = A->Val[MAX_DIM*k+4] ; | V->Val[MAX_DIM * k + 4] = A->Val[MAX_DIM * k + 4]; | |||
V->Val[MAX_DIM*k+5] = A->Val[MAX_DIM*k+5] ; | V->Val[MAX_DIM * k + 5] = A->Val[MAX_DIM * k + 5]; | |||
V->Val[MAX_DIM*k+6] = A->Val[MAX_DIM*k+6] ; | V->Val[MAX_DIM * k + 6] = A->Val[MAX_DIM * k + 6]; | |||
V->Val[MAX_DIM*k+7] = A->Val[MAX_DIM*k+7] ; | V->Val[MAX_DIM * k + 7] = A->Val[MAX_DIM * k + 7]; | |||
V->Val[MAX_DIM*k+8] = A->Val[MAX_DIM*k+8] ; | V->Val[MAX_DIM * k + 8] = A->Val[MAX_DIM * k + 8]; | |||
V->Val[MAX_DIM*(k+1) ] = -A->Val[MAX_DIM*(k+1) ] ; | V->Val[MAX_DIM * (k + 1)] = -A->Val[MAX_DIM * (k + 1)]; | |||
V->Val[MAX_DIM*(k+1)+1] = -A->Val[MAX_DIM*(k+1)+1] ; | V->Val[MAX_DIM * (k + 1) + 1] = -A->Val[MAX_DIM * (k + 1) + 1]; | |||
V->Val[MAX_DIM*(k+1)+2] = -A->Val[MAX_DIM*(k+1)+2] ; | V->Val[MAX_DIM * (k + 1) + 2] = -A->Val[MAX_DIM * (k + 1) + 2]; | |||
V->Val[MAX_DIM*(k+1)+3] = -A->Val[MAX_DIM*(k+1)+3] ; | V->Val[MAX_DIM * (k + 1) + 3] = -A->Val[MAX_DIM * (k + 1) + 3]; | |||
V->Val[MAX_DIM*(k+1)+4] = -A->Val[MAX_DIM*(k+1)+4] ; | V->Val[MAX_DIM * (k + 1) + 4] = -A->Val[MAX_DIM * (k + 1) + 4]; | |||
V->Val[MAX_DIM*(k+1)+5] = -A->Val[MAX_DIM*(k+1)+5] ; | V->Val[MAX_DIM * (k + 1) + 5] = -A->Val[MAX_DIM * (k + 1) + 5]; | |||
V->Val[MAX_DIM*(k+1)+6] = -A->Val[MAX_DIM*(k+1)+6] ; | V->Val[MAX_DIM * (k + 1) + 6] = -A->Val[MAX_DIM * (k + 1) + 6]; | |||
V->Val[MAX_DIM*(k+1)+7] = -A->Val[MAX_DIM*(k+1)+7] ; | V->Val[MAX_DIM * (k + 1) + 7] = -A->Val[MAX_DIM * (k + 1) + 7]; | |||
V->Val[MAX_DIM*(k+1)+8] = -A->Val[MAX_DIM*(k+1)+8] ; | V->Val[MAX_DIM * (k + 1) + 8] = -A->Val[MAX_DIM * (k + 1) + 8]; | |||
} | } | |||
break; | break; | |||
default : | default: | |||
Message::Error("Unknown type of arguments in function 'Conj'"); | Message::Error("Unknown type of arguments in function 'Conj'"); | |||
break; | break; | |||
} | } | |||
V->Type = A->Type ; | V->Type = A->Type; | |||
} | } | |||
/* ----------------------------------------------------------------------------- | /* ----------------------------------------------------------------------------- | |||
--- */ | --- | |||
/* Cartesian coordinates (Re,Im) to polar coordinates (Amplitude,phase[Radians] | */ | |||
) */ | /* Cartesian coordinates (Re,Im) to polar coordinates | |||
/* ----------------------------------------------------------------------------- | * (Amplitude,phase[Radians]) */ | |||
--- */ | /* ----------------------------------------------------------------------------- | |||
--- | ||||
*/ | ||||
void F_Cart2Pol(F_ARG) | void F_Cart2Pol(F_ARG) | |||
{ | { | |||
int k ; | int k; | |||
double Re, Im; | double Re, Im; | |||
switch (A->Type) { | switch(A->Type) { | |||
case SCALAR : | case SCALAR: | |||
for (k = 0 ; k < Current.NbrHar ; k+=2) { | for(k = 0; k < Current.NbrHar; k += 2) { | |||
Re = A->Val[MAX_DIM*k] ; Im = A->Val[MAX_DIM*(k+1)] ; | Re = A->Val[MAX_DIM * k]; | |||
V->Val[MAX_DIM*k] = sqrt(SQU(Re)+SQU(Im)) ; V->Val[MAX_DIM*(k+1)] = atan2( | Im = A->Val[MAX_DIM * (k + 1)]; | |||
Im,Re); | V->Val[MAX_DIM * k] = sqrt(SQU(Re) + SQU(Im)); | |||
} | V->Val[MAX_DIM * (k + 1)] = atan2(Im, Re); | |||
break; | } | |||
break; | ||||
case VECTOR : | ||||
case TENSOR_DIAG : | case VECTOR: | |||
for (k = 0 ; k < Current.NbrHar ; k+=2) { | case TENSOR_DIAG: | |||
Re = A->Val[MAX_DIM*k ] ; Im = A->Val[MAX_DIM*(k+1) ] ; | for(k = 0; k < Current.NbrHar; k += 2) { | |||
V->Val[MAX_DIM*k ] = sqrt(SQU(Re)+SQU(Im)) ; V->Val[MAX_DIM*(k+1) ] = at | Re = A->Val[MAX_DIM * k]; | |||
an2(Im,Re); | Im = A->Val[MAX_DIM * (k + 1)]; | |||
Re = A->Val[MAX_DIM*k+1] ; Im = A->Val[MAX_DIM*(k+1)+1] ; | V->Val[MAX_DIM * k] = sqrt(SQU(Re) + SQU(Im)); | |||
V->Val[MAX_DIM*k+1] = sqrt(SQU(Re)+SQU(Im)) ; V->Val[MAX_DIM*(k+1)+1] = at | V->Val[MAX_DIM * (k + 1)] = atan2(Im, Re); | |||
an2(Im,Re); | Re = A->Val[MAX_DIM * k + 1]; | |||
Re = A->Val[MAX_DIM*k+2] ; Im = A->Val[MAX_DIM*(k+1)+2] ; | Im = A->Val[MAX_DIM * (k + 1) + 1]; | |||
V->Val[MAX_DIM*k+2] = sqrt(SQU(Re)+SQU(Im)) ; V->Val[MAX_DIM*(k+1)+2] = at | V->Val[MAX_DIM * k + 1] = sqrt(SQU(Re) + SQU(Im)); | |||
an2(Im,Re); | V->Val[MAX_DIM * (k + 1) + 1] = atan2(Im, Re); | |||
} | Re = A->Val[MAX_DIM * k + 2]; | |||
break; | Im = A->Val[MAX_DIM * (k + 1) + 2]; | |||
V->Val[MAX_DIM * k + 2] = sqrt(SQU(Re) + SQU(Im)); | ||||
case TENSOR_SYM : | V->Val[MAX_DIM * (k + 1) + 2] = atan2(Im, Re); | |||
for (k = 0 ; k < Current.NbrHar ; k+=2) { | } | |||
Re = A->Val[MAX_DIM*k ] ; Im = A->Val[MAX_DIM*(k+1) ] ; | break; | |||
V->Val[MAX_DIM*k ] = sqrt(SQU(Re)+SQU(Im)) ; V->Val[MAX_DIM*(k+1) ] = at | ||||
an2(Im,Re); | case TENSOR_SYM: | |||
Re = A->Val[MAX_DIM*k+1] ; Im = A->Val[MAX_DIM*(k+1)+1] ; | for(k = 0; k < Current.NbrHar; k += 2) { | |||
V->Val[MAX_DIM*k+1] = sqrt(SQU(Re)+SQU(Im)) ; V->Val[MAX_DIM*(k+1)+1] = at | Re = A->Val[MAX_DIM * k]; | |||
an2(Im,Re); | Im = A->Val[MAX_DIM * (k + 1)]; | |||
Re = A->Val[MAX_DIM*k+2] ; Im = A->Val[MAX_DIM*(k+1)+2] ; | V->Val[MAX_DIM * k] = sqrt(SQU(Re) + SQU(Im)); | |||
V->Val[MAX_DIM*k+2] = sqrt(SQU(Re)+SQU(Im)) ; V->Val[MAX_DIM*(k+1)+2] = at | V->Val[MAX_DIM * (k + 1)] = atan2(Im, Re); | |||
an2(Im,Re); | Re = A->Val[MAX_DIM * k + 1]; | |||
Re = A->Val[MAX_DIM*k+3] ; Im = A->Val[MAX_DIM*(k+1)+3] ; | Im = A->Val[MAX_DIM * (k + 1) + 1]; | |||
V->Val[MAX_DIM*k+3] = sqrt(SQU(Re)+SQU(Im)) ; V->Val[MAX_DIM*(k+1)+3] = at | V->Val[MAX_DIM * k + 1] = sqrt(SQU(Re) + SQU(Im)); | |||
an2(Im,Re); | V->Val[MAX_DIM * (k + 1) + 1] = atan2(Im, Re); | |||
Re = A->Val[MAX_DIM*k+4] ; Im = A->Val[MAX_DIM*(k+1)+4] ; | Re = A->Val[MAX_DIM * k + 2]; | |||
V->Val[MAX_DIM*k+4] = sqrt(SQU(Re)+SQU(Im)) ; V->Val[MAX_DIM*(k+1)+4] = at | Im = A->Val[MAX_DIM * (k + 1) + 2]; | |||
an2(Im,Re); | V->Val[MAX_DIM * k + 2] = sqrt(SQU(Re) + SQU(Im)); | |||
Re = A->Val[MAX_DIM*k+5] ; Im = A->Val[MAX_DIM*(k+1)+5] ; | V->Val[MAX_DIM * (k + 1) + 2] = atan2(Im, Re); | |||
V->Val[MAX_DIM*k+5] = sqrt(SQU(Re)+SQU(Im)) ; V->Val[MAX_DIM*(k+1)+5] = at | Re = A->Val[MAX_DIM * k + 3]; | |||
an2(Im,Re); | Im = A->Val[MAX_DIM * (k + 1) + 3]; | |||
} | V->Val[MAX_DIM * k + 3] = sqrt(SQU(Re) + SQU(Im)); | |||
break; | V->Val[MAX_DIM * (k + 1) + 3] = atan2(Im, Re); | |||
Re = A->Val[MAX_DIM * k + 4]; | ||||
case TENSOR : | Im = A->Val[MAX_DIM * (k + 1) + 4]; | |||
for (k = 0 ; k < Current.NbrHar ; k+=2) { | V->Val[MAX_DIM * k + 4] = sqrt(SQU(Re) + SQU(Im)); | |||
Re = A->Val[MAX_DIM*k ] ; Im = A->Val[MAX_DIM*(k+1) ] ; | V->Val[MAX_DIM * (k + 1) + 4] = atan2(Im, Re); | |||
V->Val[MAX_DIM*k ] = sqrt(SQU(Re)+SQU(Im)) ; V->Val[MAX_DIM*(k+1) ] = at | Re = A->Val[MAX_DIM * k + 5]; | |||
an2(Im,Re); | Im = A->Val[MAX_DIM * (k + 1) + 5]; | |||
Re = A->Val[MAX_DIM*k+1] ; Im = A->Val[MAX_DIM*(k+1)+1] ; | V->Val[MAX_DIM * k + 5] = sqrt(SQU(Re) + SQU(Im)); | |||
V->Val[MAX_DIM*k+1] = sqrt(SQU(Re)+SQU(Im)) ; V->Val[MAX_DIM*(k+1)+1] = at | V->Val[MAX_DIM * (k + 1) + 5] = atan2(Im, Re); | |||
an2(Im,Re); | } | |||
Re = A->Val[MAX_DIM*k+2] ; Im = A->Val[MAX_DIM*(k+1)+2] ; | break; | |||
V->Val[MAX_DIM*k+2] = sqrt(SQU(Re)+SQU(Im)) ; V->Val[MAX_DIM*(k+1)+2] = at | ||||
an2(Im,Re); | case TENSOR: | |||
Re = A->Val[MAX_DIM*k+3] ; Im = A->Val[MAX_DIM*(k+1)+3] ; | for(k = 0; k < Current.NbrHar; k += 2) { | |||
V->Val[MAX_DIM*k+3] = sqrt(SQU(Re)+SQU(Im)) ; V->Val[MAX_DIM*(k+1)+3] = at | Re = A->Val[MAX_DIM * k]; | |||
an2(Im,Re); | Im = A->Val[MAX_DIM * (k + 1)]; | |||
Re = A->Val[MAX_DIM*k+4] ; Im = A->Val[MAX_DIM*(k+1)+4] ; | V->Val[MAX_DIM * k] = sqrt(SQU(Re) + SQU(Im)); | |||
V->Val[MAX_DIM*k+4] = sqrt(SQU(Re)+SQU(Im)) ; V->Val[MAX_DIM*(k+1)+4] = at | V->Val[MAX_DIM * (k + 1)] = atan2(Im, Re); | |||
an2(Im,Re); | Re = A->Val[MAX_DIM * k + 1]; | |||
Re = A->Val[MAX_DIM*k+5] ; Im = A->Val[MAX_DIM*(k+1)+5] ; | Im = A->Val[MAX_DIM * (k + 1) + 1]; | |||
V->Val[MAX_DIM*k+5] = sqrt(SQU(Re)+SQU(Im)) ; V->Val[MAX_DIM*(k+1)+5] = at | V->Val[MAX_DIM * k + 1] = sqrt(SQU(Re) + SQU(Im)); | |||
an2(Im,Re); | V->Val[MAX_DIM * (k + 1) + 1] = atan2(Im, Re); | |||
Re = A->Val[MAX_DIM*k+6] ; Im = A->Val[MAX_DIM*(k+1)+6] ; | Re = A->Val[MAX_DIM * k + 2]; | |||
V->Val[MAX_DIM*k+6] = sqrt(SQU(Re)+SQU(Im)) ; V->Val[MAX_DIM*(k+1)+6] = at | Im = A->Val[MAX_DIM * (k + 1) + 2]; | |||
an2(Im,Re); | V->Val[MAX_DIM * k + 2] = sqrt(SQU(Re) + SQU(Im)); | |||
Re = A->Val[MAX_DIM*k+7] ; Im = A->Val[MAX_DIM*(k+1)+7] ; | V->Val[MAX_DIM * (k + 1) + 2] = atan2(Im, Re); | |||
V->Val[MAX_DIM*k+7] = sqrt(SQU(Re)+SQU(Im)) ; V->Val[MAX_DIM*(k+1)+7] = at | Re = A->Val[MAX_DIM * k + 3]; | |||
an2(Im,Re); | Im = A->Val[MAX_DIM * (k + 1) + 3]; | |||
Re = A->Val[MAX_DIM*k+8] ; Im = A->Val[MAX_DIM*(k+1)+8] ; | V->Val[MAX_DIM * k + 3] = sqrt(SQU(Re) + SQU(Im)); | |||
V->Val[MAX_DIM*k+8] = sqrt(SQU(Re)+SQU(Im)) ; V->Val[MAX_DIM*(k+1)+8] = at | V->Val[MAX_DIM * (k + 1) + 3] = atan2(Im, Re); | |||
an2(Im,Re); | Re = A->Val[MAX_DIM * k + 4]; | |||
Im = A->Val[MAX_DIM * (k + 1) + 4]; | ||||
V->Val[MAX_DIM * k + 4] = sqrt(SQU(Re) + SQU(Im)); | ||||
V->Val[MAX_DIM * (k + 1) + 4] = atan2(Im, Re); | ||||
Re = A->Val[MAX_DIM * k + 5]; | ||||
Im = A->Val[MAX_DIM * (k + 1) + 5]; | ||||
V->Val[MAX_DIM * k + 5] = sqrt(SQU(Re) + SQU(Im)); | ||||
V->Val[MAX_DIM * (k + 1) + 5] = atan2(Im, Re); | ||||
Re = A->Val[MAX_DIM * k + 6]; | ||||
Im = A->Val[MAX_DIM * (k + 1) + 6]; | ||||
V->Val[MAX_DIM * k + 6] = sqrt(SQU(Re) + SQU(Im)); | ||||
V->Val[MAX_DIM * (k + 1) + 6] = atan2(Im, Re); | ||||
Re = A->Val[MAX_DIM * k + 7]; | ||||
Im = A->Val[MAX_DIM * (k + 1) + 7]; | ||||
V->Val[MAX_DIM * k + 7] = sqrt(SQU(Re) + SQU(Im)); | ||||
V->Val[MAX_DIM * (k + 1) + 7] = atan2(Im, Re); | ||||
Re = A->Val[MAX_DIM * k + 8]; | ||||
Im = A->Val[MAX_DIM * (k + 1) + 8]; | ||||
V->Val[MAX_DIM * k + 8] = sqrt(SQU(Re) + SQU(Im)); | ||||
V->Val[MAX_DIM * (k + 1) + 8] = atan2(Im, Re); | ||||
} | } | |||
break; | break; | |||
default : | default: | |||
Message::Error("Unknown type of arguments in function 'Cart2Pol'"); | Message::Error("Unknown type of arguments in function 'Cart2Pol'"); | |||
break; | break; | |||
} | } | |||
V->Type = A->Type ; | V->Type = A->Type; | |||
} | } | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
/* Create 1 Vector from 3 Scalar */ | /* Create 1 Vector from 3 Scalar */ | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
void F_Vector(F_ARG) | void F_Vector(F_ARG) | |||
{ | { | |||
int k ; | int k; | |||
if(A->Type != SCALAR || (A+1)->Type != SCALAR || (A+2)->Type != SCALAR) | if(A->Type != SCALAR || (A + 1)->Type != SCALAR || (A + 2)->Type != SCALAR) | |||
Message::Error("Non scalar argument(s) for function 'Vector'"); | Message::Error("Non scalar argument(s) for function 'Vector'"); | |||
for (k = 0 ; k < Current.NbrHar ; k++) { | for(k = 0; k < Current.NbrHar; k++) { | |||
V->Val[MAX_DIM*k ] = (A )->Val[MAX_DIM*k] ; | V->Val[MAX_DIM * k] = (A)->Val[MAX_DIM * k]; | |||
V->Val[MAX_DIM*k+1] = (A+1)->Val[MAX_DIM*k] ; | V->Val[MAX_DIM * k + 1] = (A + 1)->Val[MAX_DIM * k]; | |||
V->Val[MAX_DIM*k+2] = (A+2)->Val[MAX_DIM*k] ; | V->Val[MAX_DIM * k + 2] = (A + 2)->Val[MAX_DIM * k]; | |||
} | } | |||
V->Type = VECTOR ; | V->Type = VECTOR; | |||
} | } | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
/* Create 1 Tensor from 9 Scalar */ | /* Create 1 Tensor from 9 Scalar */ | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
void F_Tensor(F_ARG) | void F_Tensor(F_ARG) | |||
{ | { | |||
int k ; | int k; | |||
if( (A)->Type != SCALAR || (A+1)->Type != SCALAR || (A+2)->Type != SCALAR || | if((A)->Type != SCALAR || (A + 1)->Type != SCALAR || | |||
(A+3)->Type != SCALAR || (A+4)->Type != SCALAR || (A+5)->Type != SCALAR || | (A + 2)->Type != SCALAR || (A + 3)->Type != SCALAR || | |||
(A+6)->Type != SCALAR || (A+7)->Type != SCALAR || (A+8)->Type != SCALAR ) | (A + 4)->Type != SCALAR || (A + 5)->Type != SCALAR || | |||
(A + 6)->Type != SCALAR || (A + 7)->Type != SCALAR || | ||||
(A + 8)->Type != SCALAR) | ||||
Message::Error("Non scalar argument(s) for function 'Tensor'"); | Message::Error("Non scalar argument(s) for function 'Tensor'"); | |||
for (k = 0 ; k < Current.NbrHar ; k++) { | for(k = 0; k < Current.NbrHar; k++) { | |||
V->Val[MAX_DIM*k ] = (A )->Val[MAX_DIM*k] ; | V->Val[MAX_DIM * k] = (A)->Val[MAX_DIM * k]; | |||
V->Val[MAX_DIM*k+1] = (A+1)->Val[MAX_DIM*k] ; | V->Val[MAX_DIM * k + 1] = (A + 1)->Val[MAX_DIM * k]; | |||
V->Val[MAX_DIM*k+2] = (A+2)->Val[MAX_DIM*k] ; | V->Val[MAX_DIM * k + 2] = (A + 2)->Val[MAX_DIM * k]; | |||
V->Val[MAX_DIM*k+3] = (A+3)->Val[MAX_DIM*k] ; | V->Val[MAX_DIM * k + 3] = (A + 3)->Val[MAX_DIM * k]; | |||
V->Val[MAX_DIM*k+4] = (A+4)->Val[MAX_DIM*k] ; | V->Val[MAX_DIM * k + 4] = (A + 4)->Val[MAX_DIM * k]; | |||
V->Val[MAX_DIM*k+5] = (A+5)->Val[MAX_DIM*k] ; | V->Val[MAX_DIM * k + 5] = (A + 5)->Val[MAX_DIM * k]; | |||
V->Val[MAX_DIM*k+6] = (A+6)->Val[MAX_DIM*k] ; | V->Val[MAX_DIM * k + 6] = (A + 6)->Val[MAX_DIM * k]; | |||
V->Val[MAX_DIM*k+7] = (A+7)->Val[MAX_DIM*k] ; | V->Val[MAX_DIM * k + 7] = (A + 7)->Val[MAX_DIM * k]; | |||
V->Val[MAX_DIM*k+8] = (A+8)->Val[MAX_DIM*k] ; | V->Val[MAX_DIM * k + 8] = (A + 8)->Val[MAX_DIM * k]; | |||
} | } | |||
V->Type = TENSOR ; | V->Type = TENSOR; | |||
} | } | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
/* Create 1 Symmetric Tensor from 6 Scalar */ | /* Create 1 Symmetric Tensor from 6 Scalar */ | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
void F_TensorSym(F_ARG) | void F_TensorSym(F_ARG) | |||
{ | { | |||
int k ; | int k; | |||
if( (A)->Type != SCALAR || (A+1)->Type != SCALAR || (A+2)->Type != SCALAR || | if((A)->Type != SCALAR || (A + 1)->Type != SCALAR || | |||
(A+3)->Type != SCALAR || (A+4)->Type != SCALAR || (A+5)->Type != SCALAR ) | (A + 2)->Type != SCALAR || (A + 3)->Type != SCALAR || | |||
(A + 4)->Type != SCALAR || (A + 5)->Type != SCALAR) | ||||
Message::Error("Non scalar argument(s) for function 'TensorSym'"); | Message::Error("Non scalar argument(s) for function 'TensorSym'"); | |||
for (k = 0 ; k < Current.NbrHar ; k++) { | for(k = 0; k < Current.NbrHar; k++) { | |||
V->Val[MAX_DIM*k ] = (A )->Val[MAX_DIM*k] ; | V->Val[MAX_DIM * k] = (A)->Val[MAX_DIM * k]; | |||
V->Val[MAX_DIM*k+1] = (A+1)->Val[MAX_DIM*k] ; | V->Val[MAX_DIM * k + 1] = (A + 1)->Val[MAX_DIM * k]; | |||
V->Val[MAX_DIM*k+2] = (A+2)->Val[MAX_DIM*k] ; | V->Val[MAX_DIM * k + 2] = (A + 2)->Val[MAX_DIM * k]; | |||
V->Val[MAX_DIM*k+3] = (A+3)->Val[MAX_DIM*k] ; | V->Val[MAX_DIM * k + 3] = (A + 3)->Val[MAX_DIM * k]; | |||
V->Val[MAX_DIM*k+4] = (A+4)->Val[MAX_DIM*k] ; | V->Val[MAX_DIM * k + 4] = (A + 4)->Val[MAX_DIM * k]; | |||
V->Val[MAX_DIM*k+5] = (A+5)->Val[MAX_DIM*k] ; | V->Val[MAX_DIM * k + 5] = (A + 5)->Val[MAX_DIM * k]; | |||
} | } | |||
V->Type = TENSOR_SYM ; | V->Type = TENSOR_SYM; | |||
} | } | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
/* Create 1 Diagonal Tensor from 3 Scalar */ | /* Create 1 Diagonal Tensor from 3 Scalar */ | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
void F_TensorDiag(F_ARG) | void F_TensorDiag(F_ARG) | |||
{ | { | |||
int k ; | int k; | |||
if(A->Type != SCALAR || (A+1)->Type != SCALAR || (A+2)->Type != SCALAR) | if(A->Type != SCALAR || (A + 1)->Type != SCALAR || (A + 2)->Type != SCALAR) | |||
Message::Error("Non scalar argument(s) for function 'TensorDiag'"); | Message::Error("Non scalar argument(s) for function 'TensorDiag'"); | |||
for (k = 0 ; k < Current.NbrHar ; k++) { | for(k = 0; k < Current.NbrHar; k++) { | |||
V->Val[MAX_DIM*k ] = A->Val[MAX_DIM*k] ; | V->Val[MAX_DIM * k] = A->Val[MAX_DIM * k]; | |||
V->Val[MAX_DIM*k+1] = (A+1)->Val[MAX_DIM*k] ; | V->Val[MAX_DIM * k + 1] = (A + 1)->Val[MAX_DIM * k]; | |||
V->Val[MAX_DIM*k+2] = (A+2)->Val[MAX_DIM*k] ; | V->Val[MAX_DIM * k + 2] = (A + 2)->Val[MAX_DIM * k]; | |||
} | } | |||
V->Type = TENSOR_DIAG ; | V->Type = TENSOR_DIAG; | |||
} | } | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
/* Create 1 Tensor from 3 Vector */ | /* Create 1 Tensor from 3 Vector */ | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
void F_TensorV(F_ARG) | void F_TensorV(F_ARG) | |||
{ | { | |||
int k ; | int k; | |||
if((A)->Type != VECTOR || (A+1)->Type != VECTOR || (A+2)->Type != VECTOR) | if((A)->Type != VECTOR || (A + 1)->Type != VECTOR || (A + 2)->Type != VECTOR) | |||
Message::Error("Non scalar argument(s) for function 'TensorV'"); | Message::Error("Non scalar argument(s) for function 'TensorV'"); | |||
for (k = 0 ; k < Current.NbrHar ; k++) { | for(k = 0; k < Current.NbrHar; k++) { | |||
V->Val[MAX_DIM*k ] = (A )->Val[MAX_DIM*k ] ; | V->Val[MAX_DIM * k] = (A)->Val[MAX_DIM * k]; | |||
V->Val[MAX_DIM*k+1] = (A )->Val[MAX_DIM*k+1] ; | V->Val[MAX_DIM * k + 1] = (A)->Val[MAX_DIM * k + 1]; | |||
V->Val[MAX_DIM*k+2] = (A )->Val[MAX_DIM*k+2] ; | V->Val[MAX_DIM * k + 2] = (A)->Val[MAX_DIM * k + 2]; | |||
V->Val[MAX_DIM*k+3] = (A+1)->Val[MAX_DIM*k ] ; | V->Val[MAX_DIM * k + 3] = (A + 1)->Val[MAX_DIM * k]; | |||
V->Val[MAX_DIM*k+4] = (A+1)->Val[MAX_DIM*k+1] ; | V->Val[MAX_DIM * k + 4] = (A + 1)->Val[MAX_DIM * k + 1]; | |||
V->Val[MAX_DIM*k+5] = (A+1)->Val[MAX_DIM*k+2] ; | V->Val[MAX_DIM * k + 5] = (A + 1)->Val[MAX_DIM * k + 2]; | |||
V->Val[MAX_DIM*k+6] = (A+2)->Val[MAX_DIM*k ] ; | V->Val[MAX_DIM * k + 6] = (A + 2)->Val[MAX_DIM * k]; | |||
V->Val[MAX_DIM*k+7] = (A+2)->Val[MAX_DIM*k+1] ; | V->Val[MAX_DIM * k + 7] = (A + 2)->Val[MAX_DIM * k + 1]; | |||
V->Val[MAX_DIM*k+8] = (A+2)->Val[MAX_DIM*k+2] ; | V->Val[MAX_DIM * k + 8] = (A + 2)->Val[MAX_DIM * k + 2]; | |||
} | } | |||
V->Type = TENSOR ; | V->Type = TENSOR; | |||
} | } | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
/* Dyadic product */ | /* Dyadic product */ | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
void F_SquDyadicProduct(F_ARG) | void F_SquDyadicProduct(F_ARG) | |||
{ | { | |||
int k ; | int k; | |||
double t11, t12, t13, t22, t23, t33 ; | double t11, t12, t13, t22, t23, t33; | |||
if (A->Type != VECTOR) | if(A->Type != VECTOR) | |||
Message::Error("Non vector argument for function 'TensorDyadic'"); | Message::Error("Non vector argument for function 'TensorDyadic'"); | |||
t11 = SQU(A->Val[0]) ; t22 = SQU(A->Val[1]) ; t33 = SQU(A->Val[2]) ; | t11 = SQU(A->Val[0]); | |||
t12 = A->Val[0] * A->Val[1] ; t13 = A->Val[0] * A->Val[2] ; | t22 = SQU(A->Val[1]); | |||
t23 = A->Val[1] * A->Val[2] ; | t33 = SQU(A->Val[2]); | |||
t12 = A->Val[0] * A->Val[1]; | ||||
V->Val[0] = t11 ; V->Val[1] = t12 ; V->Val[2] = t13 ; | t13 = A->Val[0] * A->Val[2]; | |||
V->Val[3] = t22 ; V->Val[4] = t23 ; V->Val[5] = t33 ; | t23 = A->Val[1] * A->Val[2]; | |||
V->Val[0] = t11; | ||||
V->Val[1] = t12; | ||||
V->Val[2] = t13; | ||||
V->Val[3] = t22; | ||||
V->Val[4] = t23; | ||||
V->Val[5] = t33; | ||||
/* Attention : a revoir */ | /* Attention : a revoir */ | |||
if (Current.NbrHar > 1) { | if(Current.NbrHar > 1) { | |||
V->Val[MAX_DIM ] = V->Val[MAX_DIM+1] = V->Val[MAX_DIM+2] = | V->Val[MAX_DIM] = V->Val[MAX_DIM + 1] = V->Val[MAX_DIM + 2] = | |||
V->Val[MAX_DIM+3] = V->Val[MAX_DIM+4] = V->Val[MAX_DIM+5] = 0. ; | V->Val[MAX_DIM + 3] = V->Val[MAX_DIM + 4] = V->Val[MAX_DIM + 5] = 0.; | |||
for (k = 2 ; k < std::min(NBR_MAX_HARMONIC, Current.NbrHar) ; k++) { | for(k = 2; k < std::min(NBR_MAX_HARMONIC, Current.NbrHar); k++) { | |||
V->Val[MAX_DIM*k ] = V->Val[MAX_DIM*k+1] = V->Val[MAX_DIM*k+2] = | V->Val[MAX_DIM * k] = V->Val[MAX_DIM * k + 1] = V->Val[MAX_DIM * k + 2] = | |||
V->Val[MAX_DIM*k+3] = V->Val[MAX_DIM*k+4] = V->Val[MAX_DIM*k+5] = 0. ; | V->Val[MAX_DIM * k + 3] = V->Val[MAX_DIM * k + 4] = | |||
V->Val[MAX_DIM * k + 5] = 0.; | ||||
} | } | |||
} | } | |||
V->Type = TENSOR_SYM ; | V->Type = TENSOR_SYM; | |||
} | } | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
/* Get Vector Components */ | /* Get Vector Components */ | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
#define get_comp_vector(index, string) \ | #define get_comp_vector(index, string) \ | |||
int k ; \ | int k; \ | |||
\ | \ | |||
if(A->Type != VECTOR) \ | if(A->Type != VECTOR) \ | |||
Message::Error("Non vector argument for function '" string "'"); \ | Message::Error("Non vector argument for function '" string "'"); \ | |||
\ | \ | |||
for (k = 0 ; k < Current.NbrHar ; k++) { \ | for(k = 0; k < Current.NbrHar; k++) { \ | |||
V->Val[MAX_DIM*k ] = A->Val[MAX_DIM*k+index] ; \ | V->Val[MAX_DIM * k] = A->Val[MAX_DIM * k + index]; \ | |||
} \ | } \ | |||
V->Type = SCALAR ; | V->Type = SCALAR; | |||
void F_CompX(F_ARG){ get_comp_vector(0, "CompX") } | void F_CompX(F_ARG) { get_comp_vector(0, "CompX") } | |||
void F_CompY(F_ARG){ get_comp_vector(1, "CompY") } | void F_CompY(F_ARG) { get_comp_vector(1, "CompY") } | |||
void F_CompZ(F_ARG){ get_comp_vector(2, "CompZ") } | void F_CompZ(F_ARG) { get_comp_vector(2, "CompZ") } | |||
void F_Comp(F_ARG){ | void F_Comp(F_ARG) | |||
if (Fct->NbrParameters != 1) | { | |||
Message::Error("Function 'Comp': one parameter needed to define component in | if(Fct->NbrParameters != 1) | |||
dex"); | Message::Error( | |||
if ((int)(Fct->Para[0]) < 0 || (int)(Fct->Para[0]) > 2) | "Function 'Comp': one parameter needed to define component index"); | |||
Message::Error("Function 'Comp': parameter (%g) out of range (must be 0, 1 o | if((int)(Fct->Para[0]) < 0 || (int)(Fct->Para[0]) > 2) | |||
r 2)", Fct->Para[0]); | Message::Error( | |||
"Function 'Comp': parameter (%g) out of range (must be 0, 1 or 2)", | ||||
Fct->Para[0]); | ||||
get_comp_vector((int)(Fct->Para[0]), "Comp") | get_comp_vector((int)(Fct->Para[0]), "Comp") | |||
} | } | |||
#undef get_comp_vector | #undef get_comp_vector | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
/* Get Tensor Components */ | /* Get Tensor Components */ | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
#define get_comp_tensor(i, is, id, string) | #define get_comp_tensor(i, is, id, string) \ | |||
\ | int k; \ | |||
int k ; | \ | |||
\ | switch(A->Type) { \ | |||
case TENSOR: \ | ||||
\ | for(k = 0; k < Current.NbrHar; k++) \ | |||
switch(A->Type) { | V->Val[MAX_DIM * k] = A->Val[MAX_DIM * k + (i)]; \ | |||
\ | break; \ | |||
case TENSOR : | case TENSOR_SYM: \ | |||
\ | for(k = 0; k < Current.NbrHar; k++) \ | |||
for (k=0; k<Current.NbrHar; k++) V->Val[MAX_DIM*k] = A->Val[MAX_DIM*k+(i)] ; | V->Val[MAX_DIM * k] = A->Val[MAX_DIM * k + (is)]; \ | |||
\ | break; \ | |||
break ; | case TENSOR_DIAG: \ | |||
\ | if(id >= 0) \ | |||
case TENSOR_SYM : | for(k = 0; k < Current.NbrHar; k++) \ | |||
\ | V->Val[MAX_DIM * k] = A->Val[MAX_DIM * k + (id)]; \ | |||
for (k=0; k<Current.NbrHar; k++) V->Val[MAX_DIM*k] = A->Val[MAX_DIM*k+(is)] | else \ | |||
; \ | for(k = 0; k < Current.NbrHar; k++) V->Val[MAX_DIM * k] = 0.; \ | |||
break ; | break; \ | |||
\ | case SCALAR: \ | |||
case TENSOR_DIAG : | for(k = 0; k < Current.NbrHar; k++) \ | |||
\ | V->Val[MAX_DIM * k] = A->Val[MAX_DIM * k]; \ | |||
if(id >= 0) | break; \ | |||
\ | default: \ | |||
for (k=0; k<Current.NbrHar; k++) V->Val[MAX_DIM*k] = A->Val[MAX_DIM*k+(id) | Message::Error("Non tensor or scalar argument for function '" string "'"); \ | |||
] ; \ | break; \ | |||
else | } \ | |||
\ | V->Type = SCALAR; | |||
for (k=0; k<Current.NbrHar; k++) V->Val[MAX_DIM*k] = 0.; | ||||
\ | void F_CompXX(F_ARG) { get_comp_tensor(0, 0, 0, "CompXX") } | |||
break ; | void F_CompXY(F_ARG) { get_comp_tensor(1, 1, -1, "CompXY") } | |||
\ | void F_CompXZ(F_ARG) { get_comp_tensor(2, 2, -1, "CompXZ") } | |||
case SCALAR : | void F_CompYX(F_ARG) { get_comp_tensor(3, 1, -1, "CompYX") } | |||
\ | void F_CompYY(F_ARG) { get_comp_tensor(4, 3, 1, "CompYY") } | |||
for (k=0; k<Current.NbrHar; k++) V->Val[MAX_DIM*k] = A->Val[MAX_DIM*k] ; \ | void F_CompYZ(F_ARG) { get_comp_tensor(5, 4, -1, "CompYZ") } | |||
break ; | void F_CompZX(F_ARG) { get_comp_tensor(6, 2, -1, "CompZX") } | |||
\ | void F_CompZY(F_ARG) { get_comp_tensor(7, 4, -1, "CompZY") } | |||
default : | void F_CompZZ(F_ARG) { get_comp_tensor(8, 5, 2, "CompZZ") } | |||
\ | ||||
Message::Error("Non tensor or scalar argument for function '" string "'"); | ||||
\ | ||||
break; | ||||
\ | ||||
} | ||||
\ | ||||
V->Type = SCALAR ; | ||||
void F_CompXX(F_ARG){ get_comp_tensor(0,0, 0,"CompXX") } | ||||
void F_CompXY(F_ARG){ get_comp_tensor(1,1,-1,"CompXY") } | ||||
void F_CompXZ(F_ARG){ get_comp_tensor(2,2,-1,"CompXZ") } | ||||
void F_CompYX(F_ARG){ get_comp_tensor(3,1,-1,"CompYX") } | ||||
void F_CompYY(F_ARG){ get_comp_tensor(4,3, 1,"CompYY") } | ||||
void F_CompYZ(F_ARG){ get_comp_tensor(5,4,-1,"CompYZ") } | ||||
void F_CompZX(F_ARG){ get_comp_tensor(6,2,-1,"CompZX") } | ||||
void F_CompZY(F_ARG){ get_comp_tensor(7,4,-1,"CompZY") } | ||||
void F_CompZZ(F_ARG){ get_comp_tensor(8,5, 2,"CompZZ") } | ||||
#undef get_comp_tensor | #undef get_comp_tensor | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
/* Get Tensor for transformation of vector */ | /* Get Tensor for transformation of vector */ | |||
/* from cartesian to spherical coordinate system */ | /* from cartesian to spherical coordinate system */ | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
void F_Cart2Sph(F_ARG) | void F_Cart2Sph(F_ARG) | |||
{ | { | |||
int k ; | int k; | |||
double theta, phi ; | double theta, phi; | |||
if((A)->Type != VECTOR) | if((A)->Type != VECTOR) | |||
Message::Error("Vector argument required for Function 'Cart2Sph'"); | Message::Error("Vector argument required for Function 'Cart2Sph'"); | |||
/* Warning! This is the physic's convention. For the math | /* Warning! This is the physic's convention. For the math | |||
convention, switch theta and phi. */ | convention, switch theta and phi. */ | |||
theta = atan2( sqrt(SQU(A->Val[0])+ SQU(A->Val[1])) , A->Val[2] ) ; | theta = atan2(sqrt(SQU(A->Val[0]) + SQU(A->Val[1])), A->Val[2]); | |||
phi = atan2( A->Val[1] , A->Val[0] ) ; | phi = atan2(A->Val[1], A->Val[0]); | |||
/* r basis vector */ | /* r basis vector */ | |||
V->Val[0] = sin(theta) * cos(phi) ; | V->Val[0] = sin(theta) * cos(phi); | |||
V->Val[1] = sin(theta) * sin(phi) ; | V->Val[1] = sin(theta) * sin(phi); | |||
V->Val[2] = cos(theta) ; | V->Val[2] = cos(theta); | |||
/* theta basis vector */ | /* theta basis vector */ | |||
V->Val[3] = cos(theta) * cos(phi) ; | V->Val[3] = cos(theta) * cos(phi); | |||
V->Val[4] = cos(theta) * sin(phi) ; | V->Val[4] = cos(theta) * sin(phi); | |||
V->Val[5] = - sin(theta) ; | V->Val[5] = -sin(theta); | |||
/* phi basis vector */ | /* phi basis vector */ | |||
V->Val[6] = - sin(phi) ; | V->Val[6] = -sin(phi); | |||
V->Val[7] = cos(phi) ; | V->Val[7] = cos(phi); | |||
V->Val[8] = 0. ; | V->Val[8] = 0.; | |||
for (k = 0 ; k < Current.NbrHar ; k+=2) { | for(k = 0; k < Current.NbrHar; k += 2) { | |||
V->Val[MAX_DIM*k ] = V->Val[0] ; | V->Val[MAX_DIM * k] = V->Val[0]; | |||
V->Val[MAX_DIM*k+1] = V->Val[1] ; | V->Val[MAX_DIM * k + 1] = V->Val[1]; | |||
V->Val[MAX_DIM*k+2] = V->Val[2] ; | V->Val[MAX_DIM * k + 2] = V->Val[2]; | |||
V->Val[MAX_DIM*k+3] = V->Val[3] ; | V->Val[MAX_DIM * k + 3] = V->Val[3]; | |||
V->Val[MAX_DIM*k+4] = V->Val[4] ; | V->Val[MAX_DIM * k + 4] = V->Val[4]; | |||
V->Val[MAX_DIM*k+5] = V->Val[5] ; | V->Val[MAX_DIM * k + 5] = V->Val[5]; | |||
V->Val[MAX_DIM*k+6] = V->Val[6] ; | V->Val[MAX_DIM * k + 6] = V->Val[6]; | |||
V->Val[MAX_DIM*k+7] = V->Val[7] ; | V->Val[MAX_DIM * k + 7] = V->Val[7]; | |||
V->Val[MAX_DIM*k+8] = V->Val[8] ; | V->Val[MAX_DIM * k + 8] = V->Val[8]; | |||
V->Val[MAX_DIM*(k+1) ] = 0. ; | V->Val[MAX_DIM * (k + 1)] = 0.; | |||
V->Val[MAX_DIM*(k+1)+1] = 0. ; | V->Val[MAX_DIM * (k + 1) + 1] = 0.; | |||
V->Val[MAX_DIM*(k+1)+2] = 0. ; | V->Val[MAX_DIM * (k + 1) + 2] = 0.; | |||
V->Val[MAX_DIM*(k+1)+3] = 0. ; | V->Val[MAX_DIM * (k + 1) + 3] = 0.; | |||
V->Val[MAX_DIM*(k+1)+4] = 0. ; | V->Val[MAX_DIM * (k + 1) + 4] = 0.; | |||
V->Val[MAX_DIM*(k+1)+5] = 0. ; | V->Val[MAX_DIM * (k + 1) + 5] = 0.; | |||
V->Val[MAX_DIM*(k+1)+6] = 0. ; | V->Val[MAX_DIM * (k + 1) + 6] = 0.; | |||
V->Val[MAX_DIM*(k+1)+7] = 0. ; | V->Val[MAX_DIM * (k + 1) + 7] = 0.; | |||
V->Val[MAX_DIM*(k+1)+8] = 0. ; | V->Val[MAX_DIM * (k + 1) + 8] = 0.; | |||
} | } | |||
V->Type = TENSOR ; | V->Type = TENSOR; | |||
} | } | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
/* Get Tensor for transformation of vector */ | /* Get Tensor for transformation of vector */ | |||
/* from cartesian to cylindric coordinate system */ | /* from cartesian to cylindric coordinate system */ | |||
/* vector -> Cart2Cyl[XYZ[]] * vector */ | /* vector -> Cart2Cyl[XYZ[]] * vector */ | |||
/* (x,y,z)-components -> (radial, tangential, axial)-components */ | /* (x,y,z)-components -> (radial, tangential, axial)-components */ | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
void F_Cart2Cyl(F_ARG) | void F_Cart2Cyl(F_ARG) | |||
{ | { | |||
int k ; | int k; | |||
double theta ; | double theta; | |||
if((A)->Type != VECTOR) | if((A)->Type != VECTOR) | |||
Message::Error("Vector argument required for Function 'Cart2Cyl'"); | Message::Error("Vector argument required for Function 'Cart2Cyl'"); | |||
theta = atan2(A->Val[1] , A->Val[0]) ; | theta = atan2(A->Val[1], A->Val[0]); | |||
V->Val[0] = cos(theta) ; | V->Val[0] = cos(theta); | |||
V->Val[1] = sin(theta) ; | V->Val[1] = sin(theta); | |||
V->Val[2] = 0 ; | V->Val[2] = 0; | |||
V->Val[3] = -sin(theta) ; | V->Val[3] = -sin(theta); | |||
V->Val[4] = cos(theta) ; | V->Val[4] = cos(theta); | |||
V->Val[5] = 0 ; | V->Val[5] = 0; | |||
V->Val[6] = 0 ; | V->Val[6] = 0; | |||
V->Val[7] = 0 ; | V->Val[7] = 0; | |||
V->Val[8] = 1. ; | V->Val[8] = 1.; | |||
for (k = 0 ; k < Current.NbrHar ; k+=2) { | for(k = 0; k < Current.NbrHar; k += 2) { | |||
V->Val[MAX_DIM*k ] = V->Val[0] ; | V->Val[MAX_DIM * k] = V->Val[0]; | |||
V->Val[MAX_DIM*k+1] = V->Val[1] ; | V->Val[MAX_DIM * k + 1] = V->Val[1]; | |||
V->Val[MAX_DIM*k+2] = V->Val[2] ; | V->Val[MAX_DIM * k + 2] = V->Val[2]; | |||
V->Val[MAX_DIM*k+3] = V->Val[3] ; | V->Val[MAX_DIM * k + 3] = V->Val[3]; | |||
V->Val[MAX_DIM*k+4] = V->Val[4] ; | V->Val[MAX_DIM * k + 4] = V->Val[4]; | |||
V->Val[MAX_DIM*k+5] = V->Val[5] ; | V->Val[MAX_DIM * k + 5] = V->Val[5]; | |||
V->Val[MAX_DIM*k+6] = V->Val[6] ; | V->Val[MAX_DIM * k + 6] = V->Val[6]; | |||
V->Val[MAX_DIM*k+7] = V->Val[7] ; | V->Val[MAX_DIM * k + 7] = V->Val[7]; | |||
V->Val[MAX_DIM*k+8] = V->Val[8] ; | V->Val[MAX_DIM * k + 8] = V->Val[8]; | |||
V->Val[MAX_DIM*(k+1) ] = 0. ; | V->Val[MAX_DIM * (k + 1)] = 0.; | |||
V->Val[MAX_DIM*(k+1)+1] = 0. ; | V->Val[MAX_DIM * (k + 1) + 1] = 0.; | |||
V->Val[MAX_DIM*(k+1)+2] = 0. ; | V->Val[MAX_DIM * (k + 1) + 2] = 0.; | |||
V->Val[MAX_DIM*(k+1)+3] = 0. ; | V->Val[MAX_DIM * (k + 1) + 3] = 0.; | |||
V->Val[MAX_DIM*(k+1)+4] = 0. ; | V->Val[MAX_DIM * (k + 1) + 4] = 0.; | |||
V->Val[MAX_DIM*(k+1)+5] = 0. ; | V->Val[MAX_DIM * (k + 1) + 5] = 0.; | |||
V->Val[MAX_DIM*(k+1)+6] = 0. ; | V->Val[MAX_DIM * (k + 1) + 6] = 0.; | |||
V->Val[MAX_DIM*(k+1)+7] = 0. ; | V->Val[MAX_DIM * (k + 1) + 7] = 0.; | |||
V->Val[MAX_DIM*(k+1)+8] = 0. ; | V->Val[MAX_DIM * (k + 1) + 8] = 0.; | |||
} | } | |||
V->Type = TENSOR ; | V->Type = TENSOR; | |||
} | } | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
/* U n i t V e c t o r X, Y, Z */ | /* U n i t V e c t o r X, Y, Z */ | |||
/* ------------------------------------------------------------------------ */ | /* ------------------------------------------------------------------------ */ | |||
void F_UnitVectorX(F_ARG) | void F_UnitVectorX(F_ARG) | |||
{ | { | |||
int k ; | int k; | |||
for (k = 0 ; k < Current.NbrHar ; k++) { | for(k = 0; k < Current.NbrHar; k++) { | |||
V->Val[MAX_DIM*k ] = (k)? 0.:1. ; | V->Val[MAX_DIM * k] = (k) ? 0. : 1.; | |||
V->Val[MAX_DIM*k+1] = 0. ; | V->Val[MAX_DIM * k + 1] = 0.; | |||
V->Val[MAX_DIM*k+2] = 0. ; | V->Val[MAX_DIM * k + 2] = 0.; | |||
} | } | |||
V->Type = VECTOR ; | V->Type = VECTOR; | |||
} | } | |||
void F_UnitVectorY(F_ARG) | void F_UnitVectorY(F_ARG) | |||
{ | { | |||
int k ; | int k; | |||
for (k = 0 ; k < Current.NbrHar ; k++) { | for(k = 0; k < Current.NbrHar; k++) { | |||
V->Val[MAX_DIM*k ] = 0. ; | V->Val[MAX_DIM * k] = 0.; | |||
V->Val[MAX_DIM*k+1] = (k)? 0.:1. ; | V->Val[MAX_DIM * k + 1] = (k) ? 0. : 1.; | |||
V->Val[MAX_DIM*k+2] = 0. ; | V->Val[MAX_DIM * k + 2] = 0.; | |||
} | } | |||
V->Type = VECTOR ; | V->Type = VECTOR; | |||
} | } | |||
void F_UnitVectorZ(F_ARG) | void F_UnitVectorZ(F_ARG) | |||
{ | { | |||
int k ; | int k; | |||
for (k = 0 ; k < Current.NbrHar ; k++) { | for(k = 0; k < Current.NbrHar; k++) { | |||
V->Val[MAX_DIM*k ] = 0. ; | V->Val[MAX_DIM * k] = 0.; | |||
V->Val[MAX_DIM*k+1] = 0. ; | V->Val[MAX_DIM * k + 1] = 0.; | |||
V->Val[MAX_DIM*k+2] = (k)? 0.:1. ; | V->Val[MAX_DIM * k + 2] = (k) ? 0. : 1.; | |||
} | } | |||
V->Type = VECTOR ; | V->Type = VECTOR; | |||
} | } | |||
End of changes. 155 change blocks. | ||||
826 lines changed or deleted | 818 lines changed or added |