📄 solvingoperations.c
字号:
/* --> S e t T i m e */ /* ------------------------------------------ */ case OPERATION_SETTIME : Get_ValueOfExpressionByIndex(Operation_P->Case.SetTime.ExpressionIndex, NULL, 0., 0., 0., &Value) ; Current.Time = Value.Val[0] ; break ; /* --> S e t F r e q u e n c y */ /* ------------------------------------------ */ case OPERATION_SETFREQUENCY : DefineSystem_P = (struct DefineSystem*) List_Pointer(Resolution_P->DefineSystem, Operation_P->DefineSystemIndex) ; DofData_P = DofData_P0 + Operation_P->DefineSystemIndex ; if (DefineSystem_P->Type == VAL_COMPLEX){ if(DefineSystem_P->FrequencyValue) List_Reset(DefineSystem_P->FrequencyValue); else DefineSystem_P->FrequencyValue = List_Create(1, 1, sizeof(double)) ; /* Provisoire: une seule frequence */ Get_ValueOfExpressionByIndex(Operation_P->Case.SetFrequency.ExpressionIndex, NULL, 0., 0., 0., &Value) ; List_Add(DefineSystem_P->FrequencyValue, &Value.Val[0]); if (DofData_P->Pulsation == NULL) DofData_P->Pulsation = List_Create(1, 2, sizeof(double)) ; List_Reset(DofData_P->Pulsation); Init_HarInDofData(DefineSystem_P, DofData_P) ; } else Msg(GERROR, "Invalid SetFrequency for real system '%s'", DefineSystem_P->Name) ; break; /* --> T i m e L o o p T h e t a */ /* ------------------------------------------ */ case OPERATION_TIMELOOPTHETA : if(!List_Nbr(Current.DofData->Solutions)) Msg(GERROR, "Not enough initial solutions for TimeLoopTheta"); Msg(OPERATION, "TimeLoopTheta ...") ; /* FilePWM = fopen("PWM", "w+") ; */ Save_TypeTime = Current.TypeTime ; Save_DTime = Current.DTime ; Flag_NextThetaFixed = 0 ; /* Attention: Test */ Current.TypeTime = TIME_THETA ; if(Flag_RESTART) { if (Current.Time < Operation_P->Case.TimeLoopTheta.TimeMax * 0.999999) Flag_RESTART = 0 ; } else Current.Time = Operation_P->Case.TimeLoopTheta.Time0 ; while (Current.Time < Operation_P->Case.TimeLoopTheta.TimeMax * 0.999999) { if (!Flag_NextThetaFixed) { /* Attention: Test */ Get_ValueOfExpressionByIndex(Operation_P->Case.TimeLoopTheta.ThetaIndex, NULL, 0., 0., 0., &Value) ; Current.Theta = Value.Val[0] ; } if (Flag_NextThetaFixed != 2) { /* Attention: Test */ Get_ValueOfExpressionByIndex(Operation_P->Case.TimeLoopTheta.DTimeIndex, NULL, 0., 0., 0., &Value) ; Current.DTime = Value.Val[0] ; } Flag_NextThetaFixed = 0 ; Current.Time += Current.DTime ; Current.TimeStep += 1. ; Msg(BIGINFO, "Theta Time = %.8g s (TimeStep %d)", Current.Time, (int)Current.TimeStep) ; Save_Time = Current.Time ; Treatment_Operation(Resolution_P, Operation_P->Case.TimeLoopTheta.Operation, DofData_P0, GeoData_P0, NULL, NULL) ; Current.Time = Save_Time ; } Current.TypeTime = Save_TypeTime ; Current.DTime = Save_DTime ; break ; /* --> T i m e L o o p N e w m a r k */ /* ------------------------------------------ */ case OPERATION_TIMELOOPNEWMARK : if(List_Nbr(Current.DofData->Solutions) < 2) Msg(GERROR, "Not enough initial solutions for TimeLoopNewmark"); Msg(OPERATION, "TimeLoopNewmark ...") ; Save_TypeTime = Current.TypeTime ; Save_DTime = Current.DTime ; Current.Beta = Operation_P->Case.TimeLoopNewmark.Beta ; Current.Gamma = Operation_P->Case.TimeLoopNewmark.Gamma ; Current.TypeTime = TIME_NEWMARK ; if(Flag_RESTART){ if (Current.Time < Operation_P->Case.TimeLoopNewmark.TimeMax * 0.999999) Flag_RESTART = 0 ; } else Current.Time = Operation_P->Case.TimeLoopNewmark.Time0 ; while (Current.Time < Operation_P->Case.TimeLoopNewmark.TimeMax * 0.999999) { Get_ValueOfExpressionByIndex(Operation_P->Case.TimeLoopNewmark.DTimeIndex, NULL, 0., 0., 0., &Value) ; Current.DTime = Value.Val[0] ; Current.Time += Current.DTime ; Current.TimeStep += 1. ; Msg(BIGINFO, "Newmark Time = %.8g s (TimeStep %d)", Current.Time, (int)Current.TimeStep) ; Treatment_Operation(Resolution_P, Operation_P->Case.TimeLoopNewmark.Operation, DofData_P0, GeoData_P0, NULL, NULL) ; } Current.TypeTime = Save_TypeTime ; Current.DTime = Save_DTime ; break ; /* --> I t e r a t i v e L o o p */ /* ------------------------------------------ */ case OPERATION_ITERATIVELOOP : Msg(OPERATION, "IterativeLoop ...") ; for (Num_Iteration = 1 ; Num_Iteration <= Operation_P->Case.IterativeLoop.NbrMaxIteration ; Num_Iteration++) { Current.Iteration = (double)Num_Iteration ; Current.RelativeDifference = 0. ; Get_ValueOfExpressionByIndex (Operation_P->Case.IterativeLoop.RelaxationFactorIndex, NULL, 0., 0., 0., &Value) ; Current.RelaxationFactor = Value.Val[0] ; Flag_IterativeLoop = Operation_P->Case.IterativeLoop.Flag ; /* Attention: Test */ Msg(BIGINFO, "Non Linear Iteration %d (Relaxation = %g)", (int)Current.Iteration, Current.RelaxationFactor) ; Treatment_Operation(Resolution_P, Operation_P->Case.IterativeLoop.Operation, DofData_P0, GeoData_P0, NULL, NULL) ; if (Current.RelativeDifference <= Operation_P->Case.IterativeLoop.Criterion) break ; Current.RelativeDifferenceOld = Current.RelativeDifference ; /* Attention: pt */ } if (Num_Iteration > Operation_P->Case.IterativeLoop.NbrMaxIteration) Num_Iteration = Operation_P->Case.IterativeLoop.NbrMaxIteration ; Msg(BIGINFO, "Mean Error = %.3e after %d Iterations", Current.RelativeDifference, Num_Iteration) ; break ; /* --> I t e r a t i v e T i m e R e d u c t i o n */ /* ------------------------------------------------ */ case OPERATION_ITERATIVETIMEREDUCTION : Msg(OPERATION, "IterativeTimeReduction ...") ; Operation_IterativeTimeReduction (Resolution_P, Operation_P, DofData_P0, GeoData_P0) ; break ; /* --> T e s t */ /* ------------------------------------------ */ case OPERATION_TEST : Msg(OPERATION, "Test") ; Get_ValueOfExpressionByIndex(Operation_P->Case.Test.ExpressionIndex, NULL, 0., 0., 0., &Value) ; if(Value.Val[0]){ Treatment_Operation(Resolution_P, Operation_P->Case.Test.Operation_True, DofData_P0, GeoData_P0, NULL, NULL) ; } else{ if(Operation_P->Case.Test.Operation_False) Treatment_Operation(Resolution_P, Operation_P->Case.Test.Operation_False, DofData_P0, GeoData_P0, NULL, NULL) ; } break ; /* --> F o u r i e r T r a n s f o r m */ /* ------------------------------------------ */ case OPERATION_FOURIERTRANSFORM2 : Msg(OPERATION, "FourierTransform") ; if(gSCALAR_SIZE == 2) Msg(GERROR, "FIXME: FourierTransform2 will not work in complex arithmetic"); DofData_P = DofData_P0 + Operation_P->Case.FourierTransform2.DefineSystemIndex[0] ; DofData2_P = DofData_P0 + Operation_P->Case.FourierTransform2.DefineSystemIndex[1] ; NbrHar1 = DofData_P->NbrHar ; NbrDof1 = List_Nbr(DofData_P->DofList) ; NbrHar2 = DofData2_P->NbrHar ; NbrDof2 = List_Nbr(DofData2_P->DofList) ; if (NbrHar1 != 1 || NbrHar2 < 2 || NbrDof2 != (NbrDof1*NbrHar2)) Msg(GERROR,"Uncompatible System definitions for FourierTransform" " (NbrHar = %d|%d NbrDof = %d|%d)", NbrHar1, NbrHar2, NbrDof1, NbrDof2) ; if(!DofData2_P->Solutions){ DofData2_P->Solutions = List_Create(1, 1, sizeof(struct Solution)) ; Operation_P->Case.FourierTransform2.Scales = (double *)Malloc(NbrHar2*sizeof(double)) ; } Nbr_Sol = List_Nbr(DofData2_P->Solutions) ; Scales = Operation_P->Case.FourierTransform2.Scales ; if ( (Operation_P->Case.FourierTransform2.Period_sofar + Current.DTime > Operation_P->Case.FourierTransform2.Period) && Nbr_Sol ) { Msg (INFO, "Normalizing and finalizing Fourier Analysis" " (solution %d) (Period: %e out of %e)", Nbr_Sol, Operation_P->Case.FourierTransform2.Period_sofar, Operation_P->Case.FourierTransform2.Period); for (i=0 ; i<NbrHar2 ; i++) Msg(INFO, "Har %d : Scales %e ", i, Scales[i]) ; Solution_P = (struct Solution*)List_Pointer(DofData2_P->Solutions, Nbr_Sol-1); for(j=0 ; j<DofData2_P->NbrDof ; j+=NbrHar2){ NumDof = ((struct Dof *)List_Pointer(DofData2_P->DofList,j))->Case.Unknown.NumDof - 1 ; for(k=0 ; k<NbrHar2 ; k++){ LinAlg_GetDoubleInVector(&d1, &Solution_P->x, NumDof+k) ; if (Scales[k]) d1 /= Scales[k] ; LinAlg_SetDoubleInVector(d1, &Solution_P->x, NumDof+k) ; } } Operation_P->Case.FourierTransform2.Period_sofar = 0 ; break; } if (Operation_P->Case.FourierTransform2.Period_sofar == 0) { Msg (INFO, "Starting new Fourier Analysis : solution %d ", Nbr_Sol); Solution_S.TimeStep = Nbr_Sol; Solution_S.Time = Nbr_Sol; Solution_S.SolutionExist = 1 ; LinAlg_CreateVector(&Solution_S.x, &DofData2_P->Solver, DofData2_P->NbrDof, DofData2_P->NbrPart, DofData2_P->Part) ; LinAlg_ZeroVector(&Solution_S.x) ; List_Add(DofData2_P->Solutions, &Solution_S) ; Nbr_Sol++ ; for (k=0 ; k<NbrHar2 ; k++) Scales[k] = 0 ; } DofData2_P->CurrentSolution = Solution_P = (struct Solution*)List_Pointer(DofData2_P->Solutions, Nbr_Sol-1) ; for (k=0 ; k<NbrHar2 ; k+=2) { d = DofData2_P->Val_Pulsation[k/2] * Current.Time ; Scales[k ] += cos(d) * cos(d) * Current.DTime ; Scales[k+1] += sin(d) * sin(d) * Current.DTime ; } for(j=0 ; j<NbrDof1 ; j++){ Dof_GetRealDofValue(DofData_P, (struct Dof *)List_Pointer(DofData_P->DofList,j), &dd) ; NumDof = ((struct Dof *)List_Pointer(DofData2_P->DofList, j*NbrHar2))->Case.Unknown.NumDof - 1 ; if (((struct Dof *)List_Pointer(DofData2_P->DofList,j*NbrHar2))->Type != DOF_UNKNOWN) Msg (INFO, "Dof not unknown %d", j) ; for (k=0 ; k<NbrHar2 ; k+=2) { d = DofData2_P->Val_Pulsation[k/2] * Current.Time ; LinAlg_AddDoubleInVector( dd*cos(d)*Current.DTime, &Solution_P->x, NumDof+k ) ; LinAlg_AddDoubleInVector(-dd*sin(d)*Current.DTime, &Solution_P->x, NumDof+k+1) ; } } Operation_P->Case.FourierTransform2.Period_sofar += Current.DTime ; break; case OPERATION_FOURIERTRANSFORM : Msg(OPERATION, "FourierTransform") ; DofData_P = DofData_P0 + Operation_P->Case.FourierTransform.DefineSystemIndex[0] ; DofData2_P = DofData_P0 + Operation_P->Case.FourierTransform.DefineSystemIndex[1] ; if(!DofData2_P->Solutions){ k = List_Nbr(Operation_P->Case.FourierTransform.Frequency) ; if(DofData2_P->NbrDof != gCOMPLEX_INCREMENT * DofData_P->NbrDof) Msg(GERROR, "Uncompatible System definitions for FourierTransform") ; DofData2_P->Solutions = List_Create(k, 1, sizeof(struct Solution)) ; for(i=0 ; i<k ; i++){ List_Read(Operation_P->Case.FourierTransform.Frequency, i, &d) ; Solution_S.TimeStep = i ; Solution_S.Time = TWO_PI * d; Solution_S.TimeImag = 0.; Solution_S.SolutionExist = 1 ; LinAlg_CreateVector(&Solution_S.x, &DofData2_P->Solver, DofData2_P->NbrDof, DofData2_P->NbrPart, DofData2_P->Part) ; LinAlg_ZeroVector(&Solution_S.x) ; List_Add(DofData2_P->Solutions, &Solution_S) ; } DofData2_P->CurrentSolution = (struct Solution*)List_Pointer(DofData2_P->Solutions, k/2) ; } for(i=0 ; i<List_Nbr(DofData2_P->Solutions) ; i++){ Solution_P = (struct Solution*)List_Pointer(DofData2_P->Solutions, i); d = Solution_P->Time * Current.Time ; for(j=0,k=0 ; j<DofData_P->NbrDof ; j++,k+=gCOMPLEX_INCREMENT){ LinAlg_GetDoubleInVector(&d2, &DofData_P->CurrentSolution->x, j); LinAlg_AddComplexInVector( d2 * cos(d) * Current.DTime, -d2 * sin(d) * Current.DTime, &Solution_P->x, k, k+1) ; } } break; /* --> P r i n t / W r i t e */ /* ------------------------------------------ */ case OPERATION_WRITE : Flag_Binary = 1 ; case OPERATION_PRINT : if(Operation_P->Case.Print.FileOut){ if(Operation_P->Case.Print.FileOut[0] == '/' || Operation_P->Case.Print.FileOut[0] == '\\'){ strcpy(FileName, Operation_P->Case.Print.FileOut); } else{ strcpy(FileName, Name_Path); strcat(FileName, Operation_P->Case.Print.FileOut); } if(!(PrintStream = fopen(FileName, "ab"))) Msg(GERROR, "Unable to open file '%s'", FileName) ; Msg(OPERATION, "Print -> '%s'", FileName) ; } else{ PrintStream = stdout ; Msg(OPERATION, "Print")
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -