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

📄 pre_getdoffmmgroup.c

📁 cfd求解器使用与gmsh网格的求解
💻 C
字号:
#define RCSID "$Id: Pre_GetDofFMMGroup.c,v 1.8 2006/02/26 00:42:54 geuzaine Exp $"/* * Copyright (C) 1997-2006 P. Dular, C. Geuzaine * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA. * * Please report all bugs and problems to <getdp@geuz.org>. * * Contributor(s): *   Ruth Sabariego */#include "GetDP.h"#include "Treatment_Formulation.h"#include "Get_DofOfElement.h"#include "CurrentData.h"#include "Tools.h"#include "F_FMM.h"void  Pre_GetDofFMMGroup (struct Formulation * Formulation_P,			 struct QuantityStorage *QuantityStorage_P0){    struct QuantityStorage *QuantityStorageEqu_P, *QuantityStorageDof_P;  struct EquationTerm    *EquationTerm_P0, *EquationTerm_P ;  struct Element           Element ;  struct FMMData *FMMData_P0, *FMMData_P ;  struct FMMGroup FMMGroup_S ;  struct FMMmat *FMMmat_P0, *FMMmat_P ;  int Nbr_Equ, Nbr_Dof, Nbr_EquationTerm ;  int Nbr_GroupObs, Nbr_GroupSrc, Nbr_ElmsInGroup,  *ElmtsGr ;  int i_Group, iEqu, jDof, i_Element, i_EquTerm ;  int FMMObservation, FMMSource, DifBasisFunctionForEquDof ;  List_T *NumDofi, *NumEqui ;   GetDP_Begin("Pre_GetDofFMMGroup");  Nbr_EquationTerm = List_Nbr(Formulation_P->Equation) ;  EquationTerm_P0 = (struct EquationTerm*)List_Pointer(Formulation_P->Equation, 0) ;  FMMmat_P0 = (struct FMMmat*)List_Pointer(Current.DofData->FMM_Matrix, 0 ) ;  for (i_EquTerm = 0 ; i_EquTerm < Nbr_EquationTerm ; i_EquTerm++) {    EquationTerm_P = EquationTerm_P0 + i_EquTerm ;    if ( (EquationTerm_P->Case.LocalTerm.FMMObservation >= 0) &&	 (EquationTerm_P->Case.LocalTerm.FMMSource >= 0)){      FMMObservation = EquationTerm_P->Case.LocalTerm.FMMObservation ;      FMMSource = EquationTerm_P->Case.LocalTerm.FMMSource ;      DifBasisFunctionForEquDof = 1 ;      QuantityStorageDof_P = QuantityStorage_P0 + 	EquationTerm_P->Case.LocalTerm.Term.DefineQuantityIndexDof ;      QuantityStorageEqu_P = QuantityStorage_P0 + 	EquationTerm_P->Case.LocalTerm.Term.DefineQuantityIndexEqu ;            FMMmat_P = FMMmat_P0 + EquationTerm_P->Case.LocalTerm.iFMMEqu ;      FMMmat_P->EquTermIndex = i_EquTerm ;            FMMmat_P->FunctionSpaceIndexDof = 	QuantityStorageDof_P->DefineQuantity->FunctionSpaceIndex ;      FMMmat_P->FunctionSpaceIndexEqu = 	QuantityStorageEqu_P->DefineQuantity->FunctionSpaceIndex ;      FMMmat_P->TypeTimeDerivative = 	EquationTerm_P->Case.LocalTerm.Term.TypeTimeDerivative ;          if (FMMmat_P->TypeTimeDerivative != NODT_ && Current.NbrHar == 2 )	FMMmat_P->Pulsation = Current.DofData->Val_Pulsation[0] ;      if (QuantityStorageEqu_P->DefineQuantity->FunctionSpaceIndex 	  == QuantityStorageDof_P->DefineQuantity->FunctionSpaceIndex)	DifBasisFunctionForEquDof = 0 ;      List_Read(Problem_S.FMMGroup, FMMObservation, &FMMGroup_S ) ;         Nbr_GroupObs = Nbr_GroupSrc = List_Nbr(FMMGroup_S.List ) ;      FMMData_P0 = (struct FMMData*)List_Pointer(FMMGroup_S.List,0);     if (FMMmat_P->NumEqu == NULL)	FMMmat_P->NumEqu = List_Create(Nbr_GroupObs, 1, sizeof(List_T*)) ;      for ( i_Group = 0 ; i_Group < Nbr_GroupObs ; i_Group++ ) {	FMMData_P =  FMMData_P0 + i_Group ;	Element.FMMGroup = i_Group ;	Nbr_ElmsInGroup = List_Nbr(FMMData_P->Element);	ElmtsGr = (int*)(FMMData_P->Element->array) ;	NumEqui = List_Create(Nbr_ElmsInGroup,  2, sizeof(int)) ;	for (i_Element = 0 ; i_Element < Nbr_ElmsInGroup ; i_Element++) {	  Element.GeoElement = Geo_GetGeoElementOfNum(ElmtsGr[i_Element]) ;	  Element.Num    = Element.GeoElement->Num ;	  Element.Type   = Element.GeoElement->Type ;	  Current.Region = Element.Region = Element.GeoElement->Region ;	  	  if (QuantityStorageEqu_P->NumLastElementForFunctionSpace != Element.Num) {			    QuantityStorageEqu_P->NumLastElementForFunctionSpace = Element.Num ;	    	    switch (QuantityStorageEqu_P->DefineQuantity->Type) {	    case LOCALQUANTITY :	      Get_DofOfElement		(&Element, QuantityStorageEqu_P->FunctionSpace, QuantityStorageEqu_P,		 QuantityStorageEqu_P->DefineQuantity->IndexInFunctionSpace) ;	      break ;	    case INTEGRALQUANTITY :	      QuantityStorageEqu_P->NbrElementaryBasisFunction = 0 ;	      break ;	    default :	      Msg(GERROR, "Bad kind of Quantity in Formulation '%s'",		  Formulation_P->Name);	      break;	    }	  }	  	  Nbr_Equ = QuantityStorageEqu_P->NbrElementaryBasisFunction ;	  	  for (iEqu = 0; iEqu < Nbr_Equ; iEqu++)	    if (QuantityStorageEqu_P->BasisFunction[iEqu].Dof->Type == DOF_UNKNOWN)	      if ( List_PQuery( NumEqui,				&QuantityStorageEqu_P->BasisFunction[iEqu].Dof->				Case.Unknown.NumDof, fcmp_int) == NULL )		List_Add ( NumEqui, &QuantityStorageEqu_P->BasisFunction[iEqu].Dof->			   Case.Unknown.NumDof ) ;	     	  List_Sort(NumEqui, fcmp_int ) ;		  	}/* Loop on Elements in Group Observation */		  	List_Add( FMMmat_P->NumEqu, &NumEqui );      }/* Loop in Group Observation */      if ((FMMSource != FMMObservation) || DifBasisFunctionForEquDof ){	Msg(INFO, "NON SYMMETRIC Galerkin Term %d TypeTimeDerivative %d",	    i_EquTerm,  FMMmat_P->TypeTimeDerivative) ;	List_Read(Problem_S.FMMGroup, FMMSource, &FMMGroup_S ) ;   	Nbr_GroupSrc = List_Nbr(FMMGroup_S.List ) ;	FMMData_P0 = (struct FMMData*)List_Pointer(FMMGroup_S.List, 0 );	if(FMMmat_P->NumDof == NULL)	  FMMmat_P->NumDof = List_Create(Nbr_GroupSrc, 1, sizeof(List_T*)) ;		for ( i_Group = 0 ; i_Group < Nbr_GroupSrc ; i_Group++ ) {	  FMMData_P =  FMMData_P0 + i_Group ;	  Nbr_ElmsInGroup = List_Nbr(FMMData_P->Element);	  ElmtsGr = (int*)(FMMData_P->Element->array) ;	  NumDofi = List_Create(Nbr_ElmsInGroup,  2, sizeof(int)) ;	  	  for (i_Element = 0 ; i_Element < Nbr_ElmsInGroup ; i_Element++) {	    Element.GeoElement = Geo_GetGeoElementOfNum(ElmtsGr[i_Element]) ;	    Element.Num    = Element.GeoElement->Num ;	    Element.Type   = Element.GeoElement->Type ;	    Element.FMMGroup = Element.GeoElement->FMMGroup ;	    	    if (i_Group != Element.GeoElement->FMMGroup) 	      Msg(GERROR,"Wrong Element in FMMGroup i_Group %d FMMElmGroup %d Element %d ",		  i_Group, Element.FMMGroup, Element.Num ) ;	    	    Current.Region = Element.Region = Element.GeoElement->Region ;	 	    	    if (QuantityStorageDof_P->NumLastElementForFunctionSpace != Element.Num) {			      QuantityStorageDof_P->NumLastElementForFunctionSpace = Element.Num ;	      Get_DofOfElement (&Element,				QuantityStorageDof_P->FunctionSpace,				QuantityStorageDof_P, NULL);	    }	    Nbr_Dof = QuantityStorageDof_P->NbrElementaryBasisFunction ;	  	    for (jDof = 0; jDof < Nbr_Dof; jDof++)	      if (QuantityStorageDof_P->BasisFunction[jDof].Dof->Type == DOF_UNKNOWN)		if ( List_PQuery( NumDofi,				  &QuantityStorageDof_P->BasisFunction[jDof].Dof->				  Case.Unknown.NumDof, fcmp_int) == NULL )		  List_Add ( NumDofi, &QuantityStorageDof_P->BasisFunction[jDof].Dof->			     Case.Unknown.NumDof ) ;	      	    List_Sort(NumDofi, fcmp_int ) ;	    	  }/* Loop on Elements in Group Source */	  	  List_Add( FMMmat_P->NumDof, &NumDofi );	}/* Loop in Group Source */	      }/* FMMObservation != FMMSource || DifBasisForEquDof*/        else{	Msg(INFO, "SYMMETRIC Galerkin Term %d TypeTimeDerivative %d", 	    i_EquTerm, FMMmat_P->TypeTimeDerivative ) ;	(FMMmat_P->NumDof) =  (FMMmat_P->NumEqu) ;      }         }/* Galerkin + IntegralQuantity */      }/* Loop on Equation Terms */     GetDP_End ;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -