⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 solvingoperations.c

📁 cfd求解器使用与gmsh网格的求解
💻 C
📖 第 1 页 / 共 5 页
字号:
      /*  -->  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 + -